RTTI 运行时类型信息
- 首次使用一个类的静态方法时(构造函数为静态方法),
- 加载:类加载器****加载字节码(–>Class对象)
- 链接:验证字节码,分配静态储存空间
- 初始化: 初始基类,执行静态初始化器和静态初始化块
- static final不会使类被初始化
- 加载后使用Class对象创建该类的对象
Class.forName("xxx.Foo");
- getClass() 从一个对象获取其类的Class对象
- Class类:
- newInstance() 创建该类对象 ()
- getSimpleName() 获取类名
- getName() / getCanonicalName() 获取全限定名
- isInstance() 类型判断(考虑继承)
- isAssignableFrom() 是否是某类的接口或父类 (assignable: 可指定的)
反射
- RTTI 在编译时得到类型信息,运行时使用 (编译时检查class文件)
- 反射:运行时获取未知类的类型信息 (运行时打开class文件)
- Class类:
- getFields() getMethods() getConstructors() getAnnotation() 获取public域、方法、构造器、注解
- getDeclaredFields() … 获取所有域、方法…
- Field/Method . setAccessible() 设置访问权(绕过private protected)
动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface MyInterface {
void foo(int n);
}
class MyObject implements MyInterface{
@Override
public void foo(int n){
System.out.println("say: " + n);
}
}
class DynamicProxyHandler implements InvocationHandler{
MyInterface proxied;
DynamicProxyHandler(MyInterface proxied){
this.proxied = proxied;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before Invoke. " + method.getName());
Object object = method.invoke(proxied, args);
System.out.println("After Invoke.");
return object;
}
}
public class Test28_DynamicProxy {
public static void main(String[] args) {
MyObject myObject = new MyObject();
MyInterface proxyObject = (MyInterface) Proxy.newProxyInstance(
myObject.getClass().getClassLoader(),
new Class[]{MyInterface.class},
new DynamicProxyHandler(myObject));
proxyObject.foo(100);
}
}