让代码只操作基类的引用,如果添加新派生类,不会影响原有代码。
首先检查类的class对象是否已加载,如果未加载,就会根据类名查找.class,如果已加载,则接受验证,以保证其未被破坏。 static代码块,在类被加载时运行:1. Class.forName 2. new
每个类都有一个Class对象。 Java提供一种方法生产队Class对象的引用,称为类字面常量。可用于普通类、接口、数组、基本数据类型。 在使用.class创建对Class对象的引用时,不会自动初始化该class对象,初始化被延迟到了对静态方法,或非常数静态域的首次引用,除非使用Class.forName。 Class引用总指向某个Class对象,它可以创造实例,并包含作用于这些实例的所有方法代码。
xxx instanceOf XXX:用于判断类型 Class.newInstance:用于创建对象 Class.isInstance:用于判断类型
主要介绍java的动态代理,实现InvocationHandler
public interface Service { // 代理的方法 public abstract void add(); } public class ServiceImpl implements Service { public void add() { System.out.println("This is add service"); } } class MyInvocatioHandler implements InvocationHandler { private Object target; public MyInvocatioHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("-----before-----"); Object result = method.invoke(target, args); System.out.println("-----end-----"); return result; } } // 使用动态代理 public class ProxyTest { public static void main(String[] args) { Service service = new UserServiceImpl(); // 生成代理对象 MyInvocatioHandler handler = new MyInvocatioHandler(service); Service serviceProxy = (Service)Proxy.newProxyInstance(Service.class.getClassLoader(), new Class[]{Service.class}, new MyInvocatioHandler(service)); // 使用代理方法 serviceProxy.add(); } }