1.什么是反射?
反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。
2.如何得到类对象
一切反射相关的代码都从获得类对象开始
3种获取方式:
2.1 类名.class;
2.2 对象名.getClass();
2.3 Class.forName(全限定名/全路径名)
3.根据类得到类名(全限定名/全路径名)
Class cla = Class.forName(“com.zking.reflect.entity.Student”);
1)cla.getName(); -->获取全限定名
2)cla.getSimpleName(); -->获取类名
3)cla.getPackage(); -->获取包名
//传统方式实例化对象
//Student stu = new Student();
//反射机制实例化对象
Class cla = Class.forName(全限定名/全路径名);
//反射机制获得对象
Student stu = (Student)cla.newInstance();
System.out.println("类的全路径名:"+cla.getName());
System.out.println("类的简单类名:"+cla.getSimpleName());
System.out.println("类的包名:"+cla.getPackage());
4.根据类得到类的属性
//1.获得类的属性(公共的,私有的,受保护的,最终的等等)
//1.1获得类的单个属性(公共的)
Field field = cla.getField("age");
//1.2获得单个属性(公共的,私有的,受保护的,最终的等等)
Field field = cla.getDeclaredField("sname");
System.out.println("获得属性名:"+field.getName());
System.out.println("获得属性的类型:"+field.getType());
System.out.println("获得属性的访问修饰符:"+field.getModifiers());
//1.3赋值和取值
//第一个参数:类的对象 //第二个参数:所要赋值的值
//设置权限
field.setAccessible(true);
field.set(stu, "张三");
//取值
Object obj = field.get(stu);
System.out.println("sname"+obj);
//1.4获取类中的所有属性
Field [] fields = cla.getDeclaredFields();
for (Field field : fields) {
System.out.println("-----------");
System.out.println("获得属性名:"+field.getName());
System.out.println("获得属性的类型:"+field.getType());
System.out.println("获得属性的访问修饰符:"+field.getModifiers());
}
field.getName(); -->获取属性名
filed.getType(); -->获取属性类型
field.getModifiers(); -->获取属性访问修饰符
field.set(Object,Object); -->设置属性值,参数1:要设置属性所在对象;参数2:要设置的值;
field.get(Object); -->获取属性值,参数:要获取属性值的对象
field.getDeclaredField(“属性名”); -->获取单个属性(私有、公有、受保护、默认、静态)
field.getDeclaredFields(); -->获取所有属性(私有、公有、受保护、默认、静态)
5.根据类得到类的方法
//无参无返回、无参有参会、有参无返回、有参有返回
//2.获取类的方法
//方法种类:无参无返回,无参有返回,有参有返回,有参无返回
//2.1获取类中的单个方法(公共的)
//第一个参数:方法名
//第二个参数:可变参数
Method method = cla.getMethod("方法名", 可变参数(看方法里面的参数个数));
//执行方法,并得到方法的返回值
Object obj = method.invoke(方法对应的类对象, 参数值);
System.out.println(obj);
//2.2获取类中的单个方法(公共的,私有的,受保护的,最终的等等)
Method method = cla.getDeclaredMethod(方法名, Integer.class,Integer.class);
//如果是私有的方法 设置访问权限
method.setAccessible(true);
//执行方法
Object val = method.invoke(stu, 10,7);
System.out.println(val);
//2.3获取类中的所有方法
Method[] methods = cla.getMethods();
for (Method method : methods) {
System.out.println("------------------");
System.out.println("方法名:"+method.getName());
System.out.println("方法的访问修饰符:"+method.getModifiers());
System.out.println("方法的返回类型:"+method.getReturnType());
}
cla.getMethod(); -->获取单个公有方法
cla.getDeclaredMethod(); -->获取单个方法(包括私有、受保护、默认、公有)
cla.getMethods(); -->获取所有公有方法
cla.getDeclaredMethods(); -->获取所有的方法(包括私有、受保护、默认、公有)
6.根据类得到类的构造方法
cla.getConstrutor(); -->获取单个公有构造方法
cla.getDeclaredConstrutor(); -->获取单个构造方法(包括私有、受保护、默认、公有)
cla.getConstrutors(); -->获取所有的公有构造方法
cla.getDeclaredConstrutors(); -->获取所有的构造方法(包括私有、受保护、默认、公有)
7.根据类得到类的实现接口列表
Class[] interface=cla.getInterfaces(); -->获取类对象中所有实现接口列表
我举例对应的实体类:
public class Student {
private String sid;
private String sname;
public Integer age;
public Student() {
super();
System.out.println("调用无参构造方法创建了一个学生对象");
}
public Student(String sid) {
super();
this.sid = sid;
System.out.println("调用带一个参数的构造方法创建了一个学生对象");
}
public Student(String sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
System.out.println("调用带二个参数的构造方法创建了一个学生对象");
}
@SuppressWarnings("unused")
private Student(Integer age) {
System.out.println("调用Student类私有的构造方法创建一个学生对象");
this.age = age;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public void hello() {
System.out.println("你好!我是" + this.sname);
}
public void hello(String name) {
System.out.println(name + "你好!我是" + this.sname);
}
@SuppressWarnings("unused")
private Integer add(Integer a, Integer b) {
return new Integer(a.intValue() + b.intValue());
}
}