Java之六:Java Reflection

来源:互联网 发布:图片二维码识别软件 编辑:程序博客网 时间:2024/04/27 10:53

本博文主要讲诉Java Reflection的定义、相关类以及主要用途

Java Reflection:

    我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,运行状态中,对于任意一个,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Java Reflection相关类:

    位于java.lang.reflect包中。

    Class类:代表一个类。

    Field类:代表类的成员变量(成员变量也称为类的属性)。

    Method类:代表类的方法。

    Constructor 类:代表类的构造方法。 

    Proxy类提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。 

    InvocationHandler类是代理实例的调用处理程序实现的接口,每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的invoke 方法。

Java Reflection主要用途:

       在运行时判断任意一个对象所属的类

public class JudgeClass {

public static void main(String[] args){

String new String("evan");

Class s.getClass();

System.out.println(c.getName());

Class sc c.getSuperclass();

System.out.println(sc.getName());

}

}


在运行时构造任意一个类的对象

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException; 

public class CreateClass {

public static void main(String[] args) throws ClassNotFoundException,

InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentExceptionInvocationTargetExceptio{

Class Class.forName("java.lang.String");

Class[] pTypes new Class[] String.class };

Constructor ctor c.getConstructor(pTypes);

Object[] para new Object[] "evan" };

Object ctor.newInstance(para);

System.out.println(o);

}

}


在运行时判断任意一个类所具有的成员变量和方法

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class JudgeFiledsAndMethods {

public static void main(String[] args) throws ClassNotFoundException {

Class Class.forName("java.lang.String");

Field[] fi c.getDeclaredFields();

Method[] fu c.getDeclaredMethods();

for (int 0; fi.length; i++) {

System.out.println("filed fi[i].toGenericString());

}

for (int 0; fu.length; i++) {

System.out.println("method +fu[i].toGenericString());

}

}

}


在运行时调用任意一个对象的方法

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method; 

public class UseMethod {

public static void main(String[] args) throws ClassNotFoundException,

InstantiationException, IllegalAccessException, SecurityException,

NoSuchMethodException, IllegalArgumentException,

InvocationTargetExceptio{

Class Class.forName("java.lang.String");

Class[] pTypes new Class[] String.class };

Constructor ctor c.getConstructor(pTypes);

Object[] para new Object[] "EVAN" };

Object ctor.newInstance(para);

System.out.println(o);

Method c.getMethod("toLowerCase");

Object ans m.invoke(o);

System.out.println(ans);

}

}


生成动态代理:为其他对象提供一种代理以控制对这个对象的访问


定义抽象角色

public interface  Calculator {

public int add(int int b);

}


定义真实角色

public class CalculatorImpl implements Calculator {

public int add(int int b){

return a+b;

}

}


定义代理角色

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class DynamicSubject implements InvocationHandler {

private Object sub;


public DynamicSubject(Object obj) {

this.sub obj;

}


@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

System.out.println("Method:" method ",Args:" args);

return method.invoke(sub, args);

}

}


通过Proxy.newProxyInstance构建代理对象

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

public class ProxyInstance {

public static void main(String[] args){

        CalculatorImpl realSub new CalculatorImpl();

        InvocationHandler handler new DynamicSubject(realSub);

        Class classType =handler.getClass();

        //通过Proxy.newProxyInstance构建代理对象  

        Calculator sub =(Calculator)Proxy.newProxyInstance(classType.getClassLoader(),

        realSub.getClass().getInterfaces(), handler);

        System.out.println(sub.getClass());  

        System.out.println(sub.add(1,2));

}

       }

运行结果:
classcom.sun.proxy.$Proxy0
Method:public abstract intcn.ac.iie.evan.reflection.Calculator.add(int,int),Args:[Ljava.lang.Object;@37a1c887
3

由于博主知识有限,如有误,请指正点评,欢迎交流

0 0
原创粉丝点击