一、先来说一说什么是反射机制
Java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能。
二、Java反射有三个动态性质
运行时生成对象实例
运行期间调用方法
运行时更改属性
三、关键步骤如下
使用反射获取类的信息
使用反射创建对象
使用反射访问属性和方法
四、反射常用的方法
getDeclaredConstructors(): 返回Class对象锁包含类的所有构造方法
getDeclaredFields(): 返回此Class对象所包含类的的全部属性
getInterfaces(): 返回该Class对象对应类所实现的全部接口
getSuperclass(): 返回该Class所表示的父类对应的Class对象
getDeclaredMethod 返回该Class对象所包含的类的全部方法
invote 执行对象方法
五、实现
举个简单的例子
public class TestReflect<T> { public static void main(String[] args) throws Exception{ // 1,获取类型Class Class<Student>sc =Student.class; // Student s=new Student();//由于s的类型不能确定具体的对象地址(可能是子类类型)所以用? // Class<? extends Student> sc1=s.getClass();//使用对象.getclass() // Class<?> sc2=Class.forName("cn.student"); //2,获取构造方法,并且创造对象(上述所有获取类型的方法,最常用的是最后一个) Constructor<Student>c=sc.getDeclaredConstructor(int.class,double.class,String.class);//获取构造方法 c.setAccessible(true);//强行获取访问权限 Student s=c.newInstance(1,1.5,"王撕葱");//通过构造方法创建对象s System.out.println(s.getName()); //3,使用对象构造方法 Method method = sc.getDeclaredMethod("setStuNo", int.class); method.setAccessible(true);//强行获取权限 Object o = method.invoke(s, 15); System.out.println(s); System.out.println(o); //4、使用对象强行对属性赋值(如果只有私有属性,没有方法) Field stuNo = sc.getDeclaredField("stuNo");//通过属性名获取 stuNo.setAccessible(true); stuNo.set(s,18); System.out.println(s); //5,获取父类 Class<? super Student> suc = sc.getSuperclass();//获取父类的Class对象 Constructor<? super Student> cs = suc.getConstructor();//获取父类默认的构造方法 Object object = cs.newInstance(); System.out.println(object); Method think = suc.getMethod("think"); think.invoke(object); //6,获取接口 Class<?>[] i = sc.getInterfaces(); Class<?> inter = i[0];//获取父接口 } }
子类
public class Student extends Human implements Talkable { public int stuNo; private double score; @Override public String toString() { return "Student{" + "stuNo=" + stuNo + ", score=" + score + '}'; } private Student(){ } public Student( int stuNo, double score) { this.stuNo = stuNo; this.score = score; } private Student( int stuNo, double score,String name) { setName(name); this.stuNo = stuNo; this.score = score; } private int getStuNo() { return stuNo; } private void setStuNo(int stuNo) { this.stuNo = stuNo; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } }
父类
public class Human { public Human() { } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Human(String name) { this.name = name; } public void think(){ System.out.println("胡乱想"); } } 接口
package cn; public interface Talkable { }