您的位置:首页 > 编程语言 > Java开发

Java反射机制浅析

2016-05-07 16:56 537 查看
概念:

Java反射技术:允许程序在执行期取得任何已知名称的类的任何内部信息。包括:包名、类名、属性、内部类、结构体、方法,并可以在执行期变更字段内容和唤起方法。

使用步骤:

使用反射机制的步骤:

获取你操作类的Class对象->获取类中的信息->使用Reflection API操作这些信息(设置字段值、调用方法等)

使用反射机制步骤的相关函数:

forName(...)->newInstance()->[code]getDeclaredConstructors()/
getDeclaredFields()/getDeclaredMethods()等->Constructor/Method/Field类中的相关方法


注:private字段方法需要setAccessible()

关键API解析:

反射机制中的主要包和类: 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();
}
}

}


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: