JavaWeb学习12-13
2015-06-16 16:17
183 查看
12 反射
一个类有多个组成部分(成员变量,方法,构造函数)。反射就是加载类,并解剖出类的各个组成部分。
加载类
加载类的三种方式(获取类的字节码):
1、 Class clazz = Class.forName("类路径“);
2、 Class clazz = new 类().getClass();
3、 Class clazz = 类.class;
解剖类
Class对象提供了如下常用方法:
public属性
public Constructor getConstructor() 构造函数(创建对象)
public Method getMethod()方法 (执行)
public Field getField()成员变量 (封装数据)
private属性
public Constructor getDeclaredConstructor()
public Method getDeclaredMethod()
public Field getDeclaredField()
13 反射类的构造函数
利用Constructor创建对象
Person类
用反射对Person类创建对象
一个类有多个组成部分(成员变量,方法,构造函数)。反射就是加载类,并解剖出类的各个组成部分。
加载类
加载类的三种方式(获取类的字节码):
1、 Class clazz = Class.forName("类路径“);
2、 Class clazz = new 类().getClass();
3、 Class clazz = 类.class;
解剖类
Class对象提供了如下常用方法:
public属性
public Constructor getConstructor() 构造函数(创建对象)
public Method getMethod()方法 (执行)
public Field getField()成员变量 (封装数据)
private属性
public Constructor getDeclaredConstructor()
public Method getDeclaredMethod()
public Field getDeclaredField()
13 反射类的构造函数
利用Constructor创建对象
Person类
package JavaWeb.reflect; import java.util.List; public class Person { public String name = "aaaaa"; public Person(){ System.out.println("person"); } public Person(String name){ System.out.println(name); } public Person(String name,int password){ System.out.println(name+":::"+password); } private Person(List list){ System.out.println(list); } }
用反射对Person类创建对象
package JavaWeb.reflect; import java.lang.reflect.Constructor; import java.util.LinkedList; import java.util.List; import org.junit.Test; //解剖类的构造函数,创建类的对象 public class Demo2 { //反射构造函数: public Person() @Test public void test1() throws Exception{ Class clazz = Class.forName("JavaWeb.reflect.Person");//加载类 Constructor c = clazz.getConstructor(null);//获取构造方法 Person p =(Person) c.newInstance(null);//创建对象 System.out.println(p.name); } //反射构造函数: public Person(String name) @Test public void test2() throws Exception{ Class clazz = Class.forName("JavaWeb.reflect.Person"); Constructor c = clazz.getConstructor(String.class); Person p =(Person) c.newInstance("bbb"); System.out.println(p.name); } //反射构造函数: public Person(String name,int password) @Test public void test3() throws Exception{ Class clazz = Class.forName("JavaWeb.reflect.Person"); Constructor c = clazz.getConstructor(String.class,int.class); Person p =(Person) c.newInstance("bbb",12); System.out.println(p.name); } //反射构造函数:private Person(List list) @Test public void test4() throws Exception{ Class clazz = Class.forName("JavaWeb.reflect.Person"); Constructor c = clazz.getDeclaredConstructor(List.class); List list = new LinkedList(); list.add("aa"); list.add("bb"); list.add("vv"); c.setAccessible(true);//暴力反射 Person p =(Person) c.newInstance(list); System.out.println(p.name); } //创建对象的另外一种途径 一下代码等效于test1 @Test public void test5() throws Exception{ Class clazz = Class.forName("JavaWeb.reflect.Person"); Person p = (Person) clazz.newInstance();//无参构造函数函数 System.out.println(p); } }
相关文章推荐
- java.lang.RuntimeException: Unable to instantiate activity ComponentInfo异常解决
- 通过分析 JDK 源代码研究 Hash 存储机制
- struts2接收参数的几种形式
- Java - Why Enum Singleton are better in Java
- Java创建二叉树及其遍历的递归和非递归实现
- java.lang.character cannot be cast to java.lang.String
- Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationT
- Hadoop2.x的Eclipse插件编译与安装
- 接口测试-自动化-Java实现-CommonClass
- java web 项目log 配置 (将log 和hibernate的hql/sql 信息打印到控制台和日志文件中)
- 项目搭建系列之一:使用Maven搭建SpringMVC项目
- 在mac中导入hadoop2.6.0源代码至eclipse
- Java程序结束运行的原因
- Java并发编程-13-在集合点的同步-CyclicBarrier
- java的二维数组中如何计算行数和列数?
- 各种排序算法的分析及java实现
- 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
- 【JAVA编码专题】UNICODE,GBK,UTF-8区别