java反射机制,java反射
java反射机制,java反射
Java反射机制
1、 反射机制
Java的反射机制是java特性之一,反射机制是构建框架技术的基础所在。
Java反射机制是指在运行状态中,动态获取信息以及动态调用对象的功能。
Java反射有三个动态性质:
(1) 运行时生成对象实例
(2) 运行期间调用方法
(3) 运行时更改属性
2、 反射常用API
使用java反射的类如下:
Class类:反射的核心类,反射所有的操作都是围绕该类来生成的。通过Class,可以获取类的属性,
方法等内容信息。
Field类:表示累的属性,可以获取和设置类中的属性的值
Method:表示类的方法,它可以用来获取类中犯法的信息,或者执行方法
Constructor类:表示类的构造方法
在java中使用反射的基本步骤如下:
(1) 导入java.Lang.reflect.*
(2) 获得需要操作的类的java.lang.Class对象
(3) 调用Class的方法获取Field、Method等对象
(4) 使用反射API进行操作
3、 反射的应用
5个:(1) 获取类的信息
(2) 创建对象
(3) 访问类的属性
(4) 访问类的方法
(5) 使用Array类动态创建和访问数组
下面详细讲解:
(1) 获取类的信息
>获取Class对象
>>调用对象的getClass()方法
Student p=new Student();
Clsss cla=p.getClass();
>>调用类的class属性
Classcla=Student.class;
>>使用Class类的forName()静态方法
Classcla=Class.forName(“com.pb.java.reflection.Studnet”);
>从Class对象获取信息
>>访问Class对应的类包含的构造方法
>>访问Class对应的类包含的方法
>>访问Class对应的类包含的属性
···
(2) 创建对象
方式:>使用Class对象的newInstance()方法创建对象(一般创建空参构造)。
Classcla=Date.class;
Date d=(Date)cla.newInstance();
Sysout(“d.toString()”);
>使用Constructor对象创建对象(一般创建带参构造)。
Classcla=Date.class;
Constructorcu=cla.getConstructor(long.class);
Dated=(Date)cu.newInstance(1990);
Sysout(“d.toString()”);
(3) 访问类的属性
例子:访问类的私有属性,并赋值
Class Student {
Private String name;
Private int age;
Public StringtoString(){
Return “名字是”+name+”年龄是”+age.
}
}
Main{
Student s=new Student();
Class cla=Student.class;
Field nameField=cla.getDeclaredField(“name”);
nameField.setAccessible(true);
nameField.set(s,”li ming”);
Field ageField=cla.getDeclaredField(“age”);
ageField.setAccessible(true);
ageFidle.setInt(s,20);
}
注意:通常情况下,Student类的私有属性name和age只能在Student里访问,但示例代码
通过反射修改了Student对象的name和age属性值。在这里,没有用getField()方法来
获取属性,因为getField()方法只能获取public访问的权限的属性,而使用
getDeclaredField()方法则可是获取所有访问权限的熟悉性。
另外,为name和age赋值的方式不同,为name赋值使用了set(),而为age赋值则使用
了setInt()方法,因为前者是引用类型,或者为值类型(int);
(4) 访问类的方法
使用Method对象可以调用对象的方法。在Methor类中包含了invoke()方法,方法定义如下:
Object invoke(Object obj,Object args)
其中,obj是执行该方法的对象,args是执行该方法时传入该方法的参数。
例子:通过反射调用Student类的方法。
Class Student {
Private String name;
Private int age;
//+get/set方法,此处略
Public String toString(){
Return “名字是”+name+”年龄是”+age.
}
}
Main{
Student s=new Student();
Class cla=Student.class;
Method met1=cla.getMethod(“setName”,String.class);
met1.invoke(s,”liming”);
Method met2=cla.getMethod(“getName”,null);
Object o=met2.invoke(s,null);
Sysout(o);
}
注意:如果把Student类的setName()的访问权限设置为私有,这是再运行程序,则会抛出
异常,所示的NoSuchMethodException异常。这是因为当通过Method的invoke()方法
调用对应的方法时,java会要求程序必须有调用该方法的权限。如果程序确实调用某个
对象的private方法,可以先调用,setAccessible方法,将Method对象的Accessible标
志设置指示的布尔值。值为true时,则表示改Method在使用时应该取消java语言访问权
限检查。
(5) 使用Array类动态创建和访问数组
Object arr=Array.newInstance(String.class,10);
Array.set(arr,5,”jake”);
Array.set(arr,6,”john”);
Object o1=Array.get(arr,5);
Object o2=Array.get(arr,6);
相关文章
- 暂无相关文章
用户点评