Java 基础之反射简单运用
反射概念:反射即对象中域,方法,构造器等权限的转移,转移给相应的反射类来处理。
一.Class类
Java中的程序运行时,是要从含有main方法的类开始编译,由于可能该主类中还依赖了其它类,就必须先加载其它依赖的类,所有编译过的类生成的class字节码文件都是Class类的一个具体实例。
1.获取类Class对象
Class<classname> c=classname.class;
Class<?> c1=Class.forName("类路径名");
Class<? extends classname> c2=new classname().getclass();
//其中一种无参构造
classname o=c.newInstance();
二.Constructor类
实体类:
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
1.方法:
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);//获取构造器管理对象
2.示例:
@Test
public void test2() throws Exception {
//获取class对象
Class<Person> c1=Person.class;
//托管无参构造
Person ps=c1.newInstance();
//托管有参构造
Constructor<Person> cs=c1.getDeclaredConstructor(String.class,Integer.class);
Person ps1=cs.newInstance("小明",18);
System.out.println(ps1.getName()+"\n"+ps1.getAge());
}
三.Field类
1.方法
public Field getDeclaredField(String name);//获取域或者叫属性管理对象
public void setAccessible(boolean flag); //设置私有属性的访问权限
public void set(Object obj, Object value); //设置属性值
2.示例
@Test
public void test3() throws Exception {
Class<?> p=Class.forName("huang.Person");//同一包类也要加包名
Field name= p.getDeclaredField("name");
Field age=p.getDeclaredField("age");
Person p1= (Person) p.newInstance();
//开启私有属性权限操作
name.setAccessible(true);
age.setAccessible(true);
//设置属性
name.set(p1,"小明");
age.set(p1,19);
System.out.println(p1.getName()+p1.getAge());
}
四.Method类
1.方法
public Method getDeclaredMethod(String name, Class<?>... parameterTypes);//获取方法管理对象
public Object invoke(Object obj, Object... args);//执行方法
2.示例
@Test
public void test4() throws Exception {
Class<? extends Person> c3= Person.class;
Method setName=c3.getDeclaredMethod("setName", String.class);
Person p3=c3.newInstance();
//执行实例化对象方法
setName.invoke(p3,"黄小明");
System.out.println(p3.getName());
}