反射获取构造方法并创建对象
2015-11-24 21:40
495 查看
1、什么是反射?
反射:在运行状态下,通过class文件对象(Class的对象),去使用构造方法,成员变量,成员方法。
首先创建一个person类:
<span style="font-size:14px;">public class Person {
private String name;
public int age;
public Person() {
}
}</span> 获取class文件对象:有三种方法如下:
(1)Object类的getClass()方法。
<span style="font-size:14px;"> Person p = new Person();
Class c = p.getClass();
</span> (2)数据类型的静态的class属性
<span style="font-size:14px;"> Class c3 = Person.class;</span> (3)通过Class类的静态方法forName(String className)
<span style="font-size:14px;"> Class c4 = Class.forName("cn.itcast_01.Person");// true
</span>
此时有c==c3==c4,因为一个类只有一个字节码文件。
推荐使用第三种, 因为第三种方式可以结合配置文件使用。
2、反射获取构造方法
反射获取构造器的方法共三种形式:
(1)获取所有公共构造方法
<span style="font-size:14px;"> public Constructor<?>[] getConstructors()
</span> (2)获取所有构造方法
(3)获取某一种构造方法
<span style="font-size:14px;"> public Constructor<T> getConstructor(Class<?>... parameterTypes)</span>
括号中表示要传递Class类型的可变参数(可变参数请查看我的博客《可变参数》),如果获取无参构造,则不传递可变参数。如下:
Constructor con = c.getConstructor();// 表示我使用的是无参数构造方法
3、反射获取构造函数并创建对象
思路:反射获取构造器,首先要获取待创建对象的类的class文件,通过class文件获取构造器,得到构造方法,通过构造方法创建对象。
代码实现:
<span style="font-size:14px;">public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("cn.itcast_01.Person");
// 获取构造器对象,此处获取的为带两个参数的构造方法
Constructor con = c.getConstructor(String.class, int.class);
// 创建对象,创建对象方法为 newInstance()
Object obj = con.newInstance("岳飞", 39);
System.out.println(obj);
}
}
</span> 小结:反射之所以为反射,是因为一改以前的“对象.方法(或属性)”,变成了“方法对象(或属性对象).方法”来创建对象或为属性赋值,下一篇博客将阐述如何利用反射获取字段以及方法。
反射:在运行状态下,通过class文件对象(Class的对象),去使用构造方法,成员变量,成员方法。
首先创建一个person类:
<span style="font-size:14px;">public class Person {
private String name;
public int age;
public Person() {
}
}</span> 获取class文件对象:有三种方法如下:
(1)Object类的getClass()方法。
<span style="font-size:14px;"> Person p = new Person();
Class c = p.getClass();
</span> (2)数据类型的静态的class属性
<span style="font-size:14px;"> Class c3 = Person.class;</span> (3)通过Class类的静态方法forName(String className)
<span style="font-size:14px;"> Class c4 = Class.forName("cn.itcast_01.Person");// true
</span>
此时有c==c3==c4,因为一个类只有一个字节码文件。
推荐使用第三种, 因为第三种方式可以结合配置文件使用。
2、反射获取构造方法
反射获取构造器的方法共三种形式:
(1)获取所有公共构造方法
<span style="font-size:14px;"> public Constructor<?>[] getConstructors()
</span> (2)获取所有构造方法
<span style="font-size:14px;"> public Constructor<?>[] getDeclaredConstructors()</span>
(3)获取某一种构造方法
<span style="font-size:14px;"> public Constructor<T> getConstructor(Class<?>... parameterTypes)</span>
括号中表示要传递Class类型的可变参数(可变参数请查看我的博客《可变参数》),如果获取无参构造,则不传递可变参数。如下:
Constructor con = c.getConstructor();// 表示我使用的是无参数构造方法
3、反射获取构造函数并创建对象
思路:反射获取构造器,首先要获取待创建对象的类的class文件,通过class文件获取构造器,得到构造方法,通过构造方法创建对象。
代码实现:
<span style="font-size:14px;">public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("cn.itcast_01.Person");
// 获取构造器对象,此处获取的为带两个参数的构造方法
Constructor con = c.getConstructor(String.class, int.class);
// 创建对象,创建对象方法为 newInstance()
Object obj = con.newInstance("岳飞", 39);
System.out.println(obj);
}
}
</span> 小结:反射之所以为反射,是因为一改以前的“对象.方法(或属性)”,变成了“方法对象(或属性对象).方法”来创建对象或为属性赋值,下一篇博客将阐述如何利用反射获取字段以及方法。
相关文章推荐
- [zz]明月虽好by 王大根 from 豆瓣
- python · 一行流
- C++primer plus第六版课后编程练习答案4.1
- Google C++ Style Guide
- Java NIO教程(下)
- 多线程入门
- Marshal's Confusion III(快速幂)
- 【转】qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用
- Scala特质
- Mean Shift的资料
- Java NIO教程(中)
- LEETCODE--Excel Sheet Column Title
- nyoj--77--开灯问题
- 杂谈:软件开发过程中,客户在想些什么
- Android自定义ViewGroup之子控件的自动换行和添加删除
- 数据库的最大连接数过小导致openstack的dashboard报错
- 记录android反射机制【一】
- iOS开发46-iOS Swift元组(Tuples)
- JavaIO和JavaNIO
- Java NIO教程(上)