反射用处到你想不到,,, 那就不想了,直接上代码
补充一下
一,先看一下反射的概念:
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
看概念很晕的,继续往下看。
二,反射机制的作用:
1,反编译:.class–>.java
2,通过反射机制访问java对象的属性,方法,构造方法等;
这样好像更容易理解一些,下边我们具体看怎么实现这些功能。
三,在这里先看一下sun为我们提供了那些反射机制中的类:
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Modifier;
java.lang.reflect.Method;
首先来个Person类,今天就”射” 它了
public class Person {
public int id;
private String name;
public Person() {}
public Person(String name) {
this.name = name;
}
public Person(int id) {
this.id = id;
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1.通过反射获取Class对象
@Test
public void run() throws Exception{
// 三种方式获取class对象
// 类名
Class clazz1 = Person.class;
// 通过实例
Class clazz2 = new Person().getClass();
// 通过全类名
Class clazz3 = Class.forName("包名+Person");
}
2.通过反射获取构造的对象
@Test
public void run2() throws Exception{
// 获取Person的Class对象
// 获取所有的构造器
Constructor[] constructors = clazz.getConstructors();
// 获取无参数的构造器
Constructor constructor = clazz.getConstructor();
// 获取有参数的构造器
Constructor c = clazz.getConstructor(int.class,String.class);
// 创建无参实例 相对于调用无参数的构造方法
// Person p = (Person) clazz.newInstance();
Person person = (Person) constructor.newInstance();
// 创建有参实例 相对于调用无参数的构造方法
Person p2 = (Person) c.newInstance(1,"刘亦菲");
}
3.通过反射获取属性的对象
@Test
public void run3() throws Exception{
// 获取Person的Class对象
Class clazz = Class.forName("包名+Person");
// 声明实例
Person p = (Person) clazz.newInstance();
// 获取是公有的name的属性对象
Field id clazz.getField("id");
// 获取公有和私有属性对象
Field name = clazz.getDeclaredField("name");
//设置操作属性
name.setAccessible(true);
// 设置属性 p.name = "刘亦菲";
name.set(p, "刘亦菲");
}
4.通过反射获取方法的对象
@Test
public void run4() throws Exception{
// 获取Person的Class对象
Class clazz = Class.forName("包名+Person");
// 声明实例
Person p = (Person) clazz.newInstance();
//获取共有的方法
Method m = clazz.getMethod("setName", String.class);
//获取所有方法
Method m = clazz.getDeclaredMethod("setName", String.class);
//私有方法需要设置 可操作性
m.setAccessible(true);
//m 为方法对象需要设置调用 invoke 调用相应方法
m.invoke(p, "凤姐"); // p.setName = "凤姐";
}
我们不生产代码,我们知识代码的搬运工,如有侵权,本人将第一时间删除
邮箱:[email protected]
QQ交流群:336237986