欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java之六:Java Reflection,

来源: javaer 分享于  点击 44219 次 点评:155

Java之六:Java Reflection,


本博文主要讲诉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 s = new String("evan");

Class c = 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, IllegalArgumentException, InvocationTargetException {

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

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

Constructor ctor = c.getConstructor(pTypes);

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

Object o = 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 c = Class.forName("java.lang.String");

Field[] fi = c.getDeclaredFields();

Method[] fu = c.getDeclaredMethods();

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

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

}

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

System.out.println("method " + i + " " +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,

InvocationTargetException {

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

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

Constructor ctor = c.getConstructor(pTypes);

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

Object o = ctor.newInstance(para);

System.out.println(o);

Method m = c.getMethod("toLowerCase");

Object ans = m.invoke(o);

System.out.println(ans);

}

}


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


定义抽象角色

public interface  Calculator {

public int add(int a , int b);

}


定义真实角色

public class CalculatorImpl implements Calculator {

public int add(int a , 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
由于博主知识有限,如有误,请指正点评,欢迎交流

相关文章

    暂无相关文章
相关栏目:

用户点评