什么是反射?
反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
反射就是把java类中的各种成分映射成一个个的Java对象
有一个概念 所有类 类类 java.lang.Class 类对象 特定类
反射的使用(使用Student类演示)
获取Class对象的三种方式 一切反射相关的代码都从获得类对象开始
1.Class.forName(完整类名,带包名)
public static void main(String[] args) throws Exception {
//反射方式的获取类对象
Class forName = Class.forName("Com.Student");
//通过类对象来实例化该类
Student stu=(Student)forName.newInstance();
}
2.类名.class
public static void main(String[] args) throws Exception {
//反射方式获取类对象
Student stu=Student.class.newInstance();
}
3.对象.getClass()
public static void main3(String[] args) throws Exception {
//创建Student对象 传统
Student stu=new Student();
//反射方式获取类对象
stu.getClass().newInstance();
}
一般都使用Class.forName(),一个字符串可以传入也可写在配置文件中等多种方法。
注1:ClassNotFoundException(类名错|少jar包)
注2:同一类的、类对象只会创建一个
通过反射获取对象的构造方法
Student类的构造方法
//获得对象
Class<Student> c =(Class<Student>) Class.forName("Com.Student");
1.调用公开的构造方法 Constructor.getConstructor
2. 调用非公开的构造方法 Constructor.getDeclaredConstructor
需要授权 setAccessible(true)
没有授权 报错;java.lang.IllegalAccessException
通过反射获取对应对象的属性
1.获取公开的属性 public
getFiled("");
2.获取非公开的属性 private
getDeclaredFiled();
通过反射获取动态的调用方法
getMethod("方法名","方法参数")
//实例化
Student stu = c.newInstance();
//设置sname
stu.setSname("dd");
//调用公开动态方法
Method method = c.getMethod("hello", String.class);
//运行method方法
method.invoke(stu, "hello");
通过反射获取访问修饰符
getModifiers(); 获取访问修饰符
//实例化
Student stu = c.newInstance();
//先获取属性值
Field dc = c.getDeclaredField("address");
//获取该属性的修饰符
int n = dc.getModifiers();
System.out.println(n);