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()); } }