Java之六:Java Reflection,
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
由于博主知识有限,如有误,请指正点评,欢迎交流
相关文章
- 暂无相关文章
用户点评