Java的反射机制
来源:互联网 发布:js select 设置选中项 编辑:程序博客网 时间:2024/06/02 13:23
使用Java的反射机制获取类的对象,有如下几种方法:
Person p = (Person) Class.forName("Person").newInstance();或者:
Person p = Person.class.newInstance();这里的Person类就是一个Java bean,代码如下:
public class Person {private String name;private int age;public Person(){}public Person(String name, int age){this.name = name;this.age = age;}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 void speak(){System.out.println("hello, my name is " + name + ", I am " + age + " years old!");}}下面测试通过反射获取Person类的对象并调用对象的方法:
<span style="white-space:pre"></span>public static void main(String[] args) throws Exception{Person p = (Person) Class.forName("Person").newInstance();p.setName("yubo");p.setAge(12);p.speak();}执行结果为:
使用第二种方式获取类的对象并调用方法:
<span style="white-space:pre"></span>public static void main(String[] args) throws Exception{Person p = Person.class.newInstance();p.setName("yubo");p.setAge(12);p.speak();}执行结果跟上一种方法的结果相同
使用Java的反射机制,可以获取Person类中声明的所有方法,如下面的代码所示:
<span style="white-space:pre"></span>Method[] methods = Person.class.getDeclaredMethods();for(int i = 0; i < methods.length; i++){System.out.println(methods[i].getName());}执行结果如下:
通过调用getMethods()方法,可以获取Person类中的所有方法,包括父类中的方法,如下面的代码:
public class Test {public static void main(String[] args) throws Exception{Method[] methods = Person.class.getMethods();for(int i = 0; i < methods.length; i++){System.out.println(methods[i].getName());}}}执行结果为:
类似的,我们可以通过反射机制得到Person类中的字段,有两个方法:getFields()和getDeclaredFields(),具体使用就不详细说明
另外,反射机制中还可以获取类的构造方法,使用getConstructors() 或 getDeclaredConstructors(),下面把这三对方法总结如下:
*getFields()与getDeclaredFields()区别:getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
*getMethods()与getDeclaredMethods()区别:getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
*getConstructors()与getDeclaredConstructors()区别:getConstructors()只能访问类中声明为public的构造函数.getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关
通过获取类中的方法,我们可以调用这些方法,主要使用invoke来实现对方法的调用,如下面的代码:
package cn.yubo.test;import java.lang.reflect.Method;public class Test {public static void main(String[] args) throws Exception {Class<?> personCls = Class.forName("cn.yubo.test.Person");Person p = new Person();Method setNameMethod = personCls.getDeclaredMethod("setName", String.class); //①setNameMethod.invoke(p, "yubo"); <span style="white-space:pre"></span> //②System.out.println("name = " + p.getName());}}在上面的代码中,①主要是得到一个方法,第一个参数"setName"是方法的名称,第二个参数"String.class"是方法setName中需要传进的参数的类型,如果setName方法有多个参数,那么getDeclaredMethod方法后就跟上多个***.class,②主要是调用方法,其中第一个参数p是该方法所在的对象,第二个参数是需要传递的参数,由于我们是通过反射调用的Person的setName方法,所以代码②就相当于调用的setName("yubo");最后,我们调用Person类的getName方法,验证是否成功调用了setName,在控制台打印的结果如下:
- java的反射机制
- Java的反射机制
- Java的反射机制
- Java 的反射机制
- JAVA的反射机制
- Java 的反射机制
- java的反射机制
- Java的反射机制
- Java 的反射机制
- JAVA的反射机制
- Java 的反射机制
- java的反射机制
- java的反射机制
- java的反射机制
- Java的反射机制
- Java的反射机制
- Java的反射机制
- Java的反射机制
- commons-digester使用
- 操作必须使用一个可更新的查询
- 分析函数在数据分析中的应用
- 大数据hadoop7天视频教程全套
- 如何减小Domino的log.nsf的大小
- Java的反射机制
- 使用 ftrace 调试 Linux 内核,第 3 部分
- 坦克大战4.0
- 单点登录设计原理
- 'sizeWithFont:' is deprecated: first deprecated in iOS 7.0 - Use -sizeWithAttributes:
- 团队开发环境一致性
- 【转载】成为程序精英,我奋斗了7年
- 程序员如何克服拖延症
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)