java 倒映

——人的眼睛看得见别人,却看不了自己,看见的只是自己倒映的样子。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值