1.类方法提取器:Class的getMethods()和getConstructors()方法分别返回Method对象的数组和Constructor对象的数组。使用toString()可以生成一个含有完整的方法特征签名的字符串。使用indexOf()可以判断某个特定签名是否与我们的目标字符串相符。
public static void main(String[] args) {
getPackageName("SixtySix.Test12");
}
private static void getPackageName(String packageName) {
try {
Class clazz = Class.forName(packageName);
Method[] methods = clazz.getMethods();
for (Method method : methods) {
String methodName = method.getName();
System.out.println("方法名称:" + methodName);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
2.动态代理:代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替实际对象的对象。通过调用静态方法Proxy.newProxyInstance()可以创建动态代理,需要得到一个类加载器,以及InvocationHandler接口的实现。invoke()实现对真实角色的代理访问。
interface A {
void study();
void play();
}
class B implements A {
@Override
public void study() {
System.out.println("B.study()");
}
@Override
public void play() {
System.out.println("B.play()");
}
}
class C implements InvocationHandler {
A realA;
public C(A realA) {
this.realA = realA;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
method.invoke(realA, args);
return null;
}
}
public class Test2 {
public static void main(String[] args) {
A a = new B();
C c = new C(a);
A a1 = (A) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{A.class}, c);
a1.study();
}
}
3.空对象:空对象并非拥有真实的值,但它拥有真实对象的行为。instanceof可以检测空对象,不需要在所有的类中都添加 isNull()方法。使用单例可以直接使用equals.(类名.NULL)或==类名.NULL 。
abstract class A1 {
protected String name;
public abstract boolean isNil();
public abstract String getName();
}
class B1 extends A1 {
public B1(String name) {
this.name = name;
}
@Override
public boolean isNil() {
return false;
}
@Override
public String getName() {
return name;
}
}
class C1 extends A1 {
@Override
public boolean isNil() {
return true;
}
@Override
public String getName() {
return "Not Find";
}
}
class D1 {
public static final String[] names = {"Tom", "Cindy", "Anna"};
public static A1 a(String name) {
for (int i = 0; i < names.length; i++) {
if (names[i].equalsIgnoreCase(name)) {
return new B1(name);
}
}
return new C1();
}
}
public class Test3 {
public static void main(String[] args) {
A1 a1 = D1.a("Tom");
A1 a2 = D1.a("Rob");
A1 a3 = D1.a("Anna");
A1 a4 = D1.a("Julie");
System.out.println(a1.getName());
System.out.println(a2.getName());
System.out.println(a3.getName());
System.out.println(a4.getName());
}
}

被折叠的 条评论
为什么被折叠?



