标签:
Java反射技术:允许程序在执行期取得任何已知名称的类的任何内部信息。包括:包名、类名、属性、内部类、结构体、方法,并可以在执行期变更字段内容和唤起方法。
使用反射机制的步骤:
获取你操作类的Class对象->获取类中的信息->使用Reflection API操作这些信息(设置字段值、调用方法等)
使用反射机制步骤的相关函数:
forName(...)->newInstance()->getDeclaredConstructors()/
getDeclaredFields()/
getDeclaredMethods()等->Constructor/Method/Field类中的相关方法
注:private字段方法需要setAccessible()
反射机制中的主要包和类: java.lang.reflect、java.lang.Class
java.lang.reflect中:
类Constructor、Field、Method继承自java.lang.reflect.AccessibleObject
1. AccessibleObject类提供了将反射的对象标记为在使用时取消默认Java语言访问控制检查的能力。
关键方法:
public static void setAccessible(AccessibleObject[] array,Boolean flag)
public void setAccessible(Booleanflag)
值为true则指示反射的对象在使用时应该取消Java语言访问检查。
2. public final class Construcor<T>extends AccessibleObject
提供了构造函数的修饰、名称、参数、参数类型等一系列方法。
关键方法:
public T newInstance(Object…initargs):使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
3. public final class Fieldextends AccessibleObject
提供了获取Field的修饰、字段名称、字段类型、字段的值、设置字段的值的一系列方法。
关键方法:
public Object get(Object obj):返回指定对象上此Field表示的字段的值。类似的有getInt(Objectobj),getFloat,getDouble等
public void set(Object obj,Object value):将指定对象变量上此Field对象表示的字段设置为指定的新值。类似的有setBoolean(Object obj,Boolean z)等。
4. public final class Methodextends AccessibleObject
提供获取Method的名称、修饰、参数类型、返回值类型等一系列相关的方法.
关键方法:
public Object invoke(Objectobj,Object… args):调用该方法
Obj:从中调用底层方法的对象;
args:用于方法调用的参数。
java.lang.Class中:
1. 提供了获取类中的字段、方法、构造方法、父类、此类的包等一系列的方法
关键方法:
public static Class<?>forName(String className):Class实例化对象
public T newInstance():类className的一个实例化对象。
注意:上述方法的返回值就是定义在java.lang.reflect中的Constructor、Field、Method。
_reflection类:将被反射调用的类
public class _reflection { private String username = "LiZZZZZQQQQ"; private String password = "woyebuzhidao"; private void printData1(){ System.out.println("来自private void printData1()"); System.out.println("username:"+username+"|"+"password:"+password); } public void printData2(){ System.out.println("来自public void printData2()"); System.out.println("username:"+username+"|"+"password:"+password); } }
mainRefelction类:反射调用_reflection类中的字段方法
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class mainRefelction { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { //第1步:获取要操作类的Class实例 Class class1 = Class.forName("_reflection");//Class的实例化 Object object = class1.newInstance();//_reflection的实例化 //第2步:获取要操作类中的字段与方法 Field fields[] = class1.getDeclaredFields(); Method methods[] = class1.getDeclaredMethods(); //调用Field中的方法,设置和输出字段的值 int num1 = fields.length; for(int i=0;i<num1;i++){ //取消Java语言访问检查 fields[i].setAccessible(true); System.out.println(fields[i].getName()+":"+fields[i].get(object)); } //设置某个确定Field的值 Field field = class1.getDeclaredField("password"); field.setAccessible(true); field.set(object, "012345789"); //调用_reflection中的方法 int num2 = methods.length; for(int j=0;j<num2;j++){ methods[j].setAccessible(true); methods[j].invoke(object, null); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
结果:
标签:
原文地址:http://blog.csdn.net/lzq729089549/article/details/51338708