Java反射
try {
//返回与带有给定字符串名的类或接口相关联的 Class 对象。
Class cl = Class.forName("cfl.test.entity.Student");
//创建此 Class 对象所表示的类的一个新实例。
Object ob= cl.newInstance();
System.out.println(ob);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
1.getDeclaredConstructor()方法(得到实例指定的构造)
// 返回与带有给定字符串名的类或接口相关联的 Class 对象。
Class cl = Class.forName("cfl.test.entity.Student");
/该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Constructor cs = cl.getDeclaredConstructor(String.class,
Integer.class);
System.out.println(cs.getName());
// 创建此 Class 对象所表示的类的一个新实例。
Student ob = (Student) cs.newInstance("曹飞龙", 5);
System.out.println(ob.getName() + " " + ob.getName());
2.getDeclaredConstructors()方法(得到实例的所有构造)
// 返回与带有给定字符串名的类或接口相关联的 Class 对象。
Class cl = Class.forName("cfl.test.entity.Student");
//该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Constructor [] cs = cl.getDeclaredConstructors();
for(Constructor c : cs ){
System.out.println(c.getName());
}
3.getDeclaredFields()(得到实例的所有的字段)
// 返回与带有给定字符串名的类或接口相关联的 Class 对象。
Class cl = Class.forName("cfl.test.entity.Student");
//创建此 Class 对象所表示的类的一个新实例
Student obj = (Student)cl.newInstance();
// 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
Field[] fls = cl.getDeclaredFields();
for (Field fl : fls) {
//判断实例的属性是否为私有的(private)
if (!fl.isAccessible()){
//将实例的属性的访问权限设置为可访问的
fl.setAccessible(true);
}
if(fl.getName().equals("name")){
//给实例的属性赋值
fl.set(obj, "cfl");
}
System.out.println(fl.getName());
}
System.out.println(obj.getName())
4.getDeclaredField()得到实例指定的属性
// 返回与带有给定字符串名的类或接口相关联的 Class 对象。
Class cl = Class.forName("cfl.test.entity.Student");
//创建此 Class 对象所表示的类的一个新实例
Student obj = (Student)cl.newInstance();
//返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field fl = cl.getDeclaredField("name");
if (!fl.isAccessible()){
fl.setAccessible(true);
}
fl.set(obj, "曹飞龙");
System.out.println(obj.getName());
5.getDeclaredMethod()得到实例的指定的方法
实例1:(不带参数)
// 返回与带有给定字符串名的类或接口相关联的 Class 对象。
Class cl = Class.forName("cfl.test.entity.Student");
// 创建此 Class 对象所表示的类的一个新实例
Student obj = (Student) cl.newInstance();
//返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method md = cl.getDeclaredMethod("play");
//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
md.invoke(obj);
实例2:(带参数)
// 返回与带有给定字符串名的类或接口相关联的 Class 对象。
Class cl = Class.forName("cfl.test.entity.Student");
// 创建此 Class 对象所表示的类的一个新实例
Student obj = (Student) cl.newInstance();
//返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method md = cl.getDeclaredMethod("play",String.class);
//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
md.invoke(obj,"曹飞龙");
6.getDeclaredMethods()得到实例的所有的方法
// 返回与带有给定字符串名的类或接口相关联的 Class 对象。
Class cl = Class.forName("cfl.test.entity.Student");
// 创建此 Class 对象所表示的类的一个新实例
Student obj = (Student) cl.newInstance();
//返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method [] mds = cl.getDeclaredMethods();
for(Method md :mds){
System.out.println(md.getName());
}
-------student类代码----------------------
public class Student {
private String name;
private Integer age;
public Student(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
}
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;
}
@Override
public String toString() {
return super.toString();
}
public void play(){
System.out.println("同学们在play");
}
public void play(String name ){
System.out.println(name+"在play");
}
}
//本人对反射的理解只有这么多了希望同志们多提宝贵意见