反射机制之运用

来源:互联网 发布:淘宝退货地址哪里设置 编辑:程序博客网 时间:2024/05/29 11:10

一.概述反射:

反射:能够在运行状态下分析类能力的程序,

类:包括域(field),方法(method),构造器(constructor),

故反射可以用来:1.可以在运新状态下分析类的能力,即类中的域,方法,构造器

2.可以在运新状态下查看对象,并创建对象

3.实现通用的数组操作

二.Class类

在J程序期间,Java运行时系统始终为所用的对象维护一个类型标识,跟踪者对象所属的类,虚拟机再选择类所属的方法进行编译执行,

(1)类的实例获取方法:

class People{
private String name;
private int age;
private String sex;

public People(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public People(){
super();
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}

}

方法一:Object的getClass()方法获取Class类型的实例/对象:People p; Class c1=p.getClass()-->Class类型的实例,

方法二:静态方法forName()获取类型对应的对象,String className="People",Class c2=Class.forName(className);

方法三:T.class,T为任意Java类型,借助方法一,Class c3=c1.getName().class,c1.getName()为类p所在类的名字People,即Classc3=People.class

(2).构建一个新的对象:Object  newInstance(Object[] args),

Objectp1= p.getClass().newInstance(),构建了一个无参p1对象,与p的对象类型一致

三.反射分析类的能力

反射分析类的能力即:域(成员变量),方法,构造器对应java.lang.reflect的三个类:Field,Method,Constructor

1.Field类

java.lang .Class

(1).Field[] getFields()-->返回一个包含Field对象的数组,这些对象记录了这个类或其超类的公有域

(2).Field[] getDeclaredFields();-->仅这个类或接口的全部方法

(3)Field getField(String name)-->返回指定名称的公有域

(4)Field getDeclaredField()-->返回指定类中声明的指定名称的域

java.lang.reflect.AccessibleObject

(1)void setAccessibe(boolean flag)-->为反射对象设置可访问标志,true:屏蔽java语言的访问检查,可以访问private,false:默认值,不屏蔽

(2)boolean isAccessible()-->返回反射对象的可访问标志的值

(3)Static void setAccessible(AccessibleObjec[] array,boolean flag)-->设置对象数组的可访问标志,true:屏蔽java语言的访问检查

java.lang.reflect.Field

Object get(Object obj)-->返回obj对象中用Field对象表示的域值

void set(Object obj,Object newValue)-->设置Object对象中Field对象表示的域值

getType();-->返回对应域的类型

getName();-->返回对应域的域名

java.lang.reflect.Modifier

static boolean isAbstract(int modeifiers);

static boolean isFinal(int modeifiers);

static boolean isInterface(int modeifiers);

static boolean isNative(int modeifiers);

static boolean isPrivate(int modeifiers);

static boolean isDouble(int modeifiers);

static boolean isStatic(int modeifiers);

static boolean isSychtonized(int modeifiers);

static boolean isStrict(int modeifiers);

实例:

People p1=new People("lilei",23,"woman");

Class c=p1.getClass();//People 在包com.cn下创建,结果为class com.cn.People

Field[] fields=c.getDeclaredFields();//得到People类下所有的域

AccessibleObject.setAccessible(fields,true);//设置对象数组的可访问标志,用于访问private
for(Field f:fields){
String modifiers=Modifier.toString(f.getModifiers());//修饰符private'
if(modifiers.length()>0){
System.out.println("field中modifiers:"+modifiers);
}
String name=f.getName();//域名,name,age,sex
System.out.println("域名为:"+name);
Class type=f.getType();//域的类型
type.isPrimitive();//用于检测是否如下类型: byte, char, short, int, long, float, and double
System.out.println("field中的type为:"+type);

try {
Object value=f.get(p1);//域值为:lilei",23,"woman"
System.out.println("values的值为:"+value);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

2.Method类

java.lang.Class

(1).Method[] getMethods()-->返回一个包含Method对象的数组,这些对象记录了这个类或其超类的公方法

(2).Method[]getDeclaredMethods();-->仅这个接口或方法的全部方法

java.lang.Method

(3) public Object invoke(Object inplitParameter,Object[] explicitParameters)-->调用这个对象所描述的方法,

(4)getParameterTypes()

(5).getReturnType();//返回方法的返回值类型

传递给定参数,并返回方法的返回值,对于静态方法,把null作为隐式参数传递在使用包装器传递基本类型的值时,

基本类型返回值必须为未包装的

实例:

People p1=new People("lilei",23,"woman");

Class c=p1.getClass();

Method[] methods=c.getDeclaredMethods();
for(Method m : methods){
Class retunType=m.getReturnType();//返回方法的返回值类型
String name=m.getName();//获取方法名
System.out.println("Class中method的名称:"+name);
String modifiers=Modifier.toString(m.getModifiers());//说明符public
if(modifiers.length()>0){
System.out.println("mehtod中modifiers的值为:"+modifiers);
}
System.out.println("retunType的name为:"+retunType.getName());

Class[] paraTypes=m.getParameterTypes();//获取方法的参数
for(Class paraType:paraTypes){
System.out.println("method参数类型为:"+paraType.getName());
}

3.Constuctor类

java.lang.Class

(1).Constuctor[] getConstructors()

(2).Constuctor[]getDeclaredConstructors();-->返回一个Constuctor对象的数组,其中包括了Class对象所描述的类的所有构造器


People p1=new People("lilei",23,"woman");

Class c=p1.getClass();

Constructor[] constructors=c.getDeclaredConstructors();
for(Constructor con:constructors){
String modifiers=Modifier.toString(con.getModifiers());
if(modifiers.length()>0){
System.out.println("构造器中modifiers:"+modifiers);
}
String name=con.getName();//获取无参构造器的名称
System.out.println("构造器名称为:"+name);
Class[] types=con.getParameterTypes();//获取无参构造器的参数类型
for(Class type:types){
System.out.println("constructor中的type为:"+type);
}


原创粉丝点击