——人的眼睛看得见别人,却看不了自己,看见的只是自己倒映的样子。
java倒映(反射)技术就是java中class对象通过一些封装好的api来倒映发现自身的特征和信息。
1.通过倒映,得到class对象的特征信息。
class A implements B
{
String type;
public A()
{
type="Hello";
}
public void sayHello()
{
System.out.println(type);
}
}
public interface B {
public void say();
}
public static void main(String[] args)
{
Class<?>[] inter=A.class.getInterfaces();
for(Class c:inter)
System.out.println(c);
Package p=A.class.getPackage();
System.out.println(p.isSealed());
Constructor[] con=A.class.getConstructors();
for(Constructor c:con)
System.out.println(c.toGenericString());
Field[] m=A.class.getFields();
for(Field f:m)
System.out.println(f.toGenericString());
Method[] me=A.class.getMethods();
for(Method f:me)
System.out.println(f.toGenericString());
}
Package的isSealed方法是关于package是否是加封的,具体见
http://www.ibm.com/developerworks/cn/java/l-seal/
interface code.B false public code.A() public code.A(java.lang.String) public java.lang.String code.A.type public void code.A.say() public static void code.A.main(java.lang.String[]) public final void java.lang.Object.wait() throws java.lang.InterruptedException public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public native int java.lang.Object.hashCode() public final native java.lang.Class<?> java.lang.Object.getClass() public boolean java.lang.Object.equals(java.lang.Object) public java.lang.String java.lang.Object.toString() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll()
2.哈哈镜。得到不同或是奇怪的自身特征信息。代理技术,拦截了对对象方法的调用
public class Aproxy implements InvocationHandler{
A a;
public static void main(String[] args)
{
Aproxy proxy=new Aproxy("hello world");
B b=(B) Proxy.newProxyInstance(proxy.getClass().getClassLoader(), proxy.a.getClass().getInterfaces(), proxy);
b.say();
}
private Aproxy(String string) {
a=new A(string);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用"+method.toGenericString()+"方法");
return method.invoke(a, args);
}
}
此时,对象的创建是通过Proxy.newProxyInstance()方法创建的,参数分别为类加载器,接口数组,方法调用的代理器。
方法的实现可以直接在invoke中实现
public class Aproxy implements InvocationHandler{
public static void main(String[] args)
{
Aproxy proxy=new Aproxy();
C b=(C) Proxy.newProxyInstance(proxy.getClass().getClassLoader(), new Class[]{C.class}, proxy);
b.sayHello();
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用"+method.toGenericString()+"方法");
System.out.println("hello");
return null;
}
}
public interface C {
public void sayHello();
}
输出
调用public abstract void code.C.say()方法
hello