what是反射
1.动态方法调用
2.反射读写属性
3.什么是反射
反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
类对象的方式
获取类对象的方式 一切反射相关的代码都从获得类对象开始
1、通过对应类(java.lang.Class)实例的类(Student.class)实例的个体getClass()方法获取
通用增删改的时候用到
Class clz = stu.getClass();
2、通过Class.forName(“类的全路径”); JDBC的驱动加载就用到反射技术
package com.houzhihong.demo;
public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException {
//获取类对象的三种方式
//1.class.forName("完整的类名")
Class c1=Class.forName("com.demo.Student");
//包和类名
System.out.println(c1.getName());
//类名
System.out.println(c1.getSimpleName());
//2.类名.class
Class c2= Student.class;
System.out.println(c2.getName());
//3.类型对象.getclass
Student stu = new Student();
Class c3=stu.getClass();
System.out.println(c3.getName());
//同一个类的类对象只会创建一次
System.out.println(c1==c2);
System.out.println(c2==c3);
}
}
3、类实例.class 做通用查询用到
Class clz = Student.class;
System.out.println(clz);
Class c = Student.class;
Class clz = Class.forName(c.getCanonicalName());
System.out.println(clz);
4.利用反射进行实例化 反射的好处: 能够将未知的类进行实例化 ClassNotFoundException
通过反射的方式调用无参构造器来实例化对象
Object stu = clz.newInstance();//建造实例
5.通过反射的方式调用带有一个参数的构造器来实例化对象 Class Constructor描述了所以构造器方法
package com.houzhihong.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Demo2 {
//实例化对象
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
// TODO Auto-generated method stub
//实例化对象
// Student stu = new Student();
//反射机制实例化
Class c1 =Class.forName("com.demo.Student");
Student stu2=(Student) c1.newInstance();
//带有参的构造方法
Constructor c2= c1.getConstructor(String.class,String.class);
Student stu3=(Student) c2.newInstance("s686","aaa");
System.out.println(stu3);
//调用私有的构造方法
Constructor c3= c1.getDeclaredConstructor(Integer.class);
c3.setAccessible(true);//打开权限
Student stu4 =(Student) c3.newInstance(20);
System.out.println(stu4);
}
}
通过反射的方式调用带有一个参数的构造器来实例化对象
Constructor c = clz.getConstructor(String.class,String.class);
Student stu = (Student) c.newInstance("s001","zs");
6.通过反射的方式调用私有的构造器来实例化对象 Class
. getConstructor与getDeclaredConstructor
. getConstructor获取到的是public修饰的
. getDeclaredConstructor 获取的所有得构造器
Constructor c = clz.getDeclaredConstructor(Integer.class);
c.setAccessible(true);
Student stu = (Student) c.newInstance(23);
7.读写属性
package com.houzhihong.demo;
import java.lang.reflect.Field;
public class Demo3 {
//读写属性
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
// TODO Auto-generated method stub
Student s= new Student();
//反射机制实例化
Class c1 =Class.forName("com.demo.Student");
//获取类对象的属性
Field field=c1.getField("age");
//给属性赋值
field.set(s, 20);
//得到类对象的值
Integer age=(Integer)field.get(s);
System.out.println(age);
//获取私有的属性
Field sidfield= c1.getDeclaredField("sid");
sidfield.setAccessible(true);
sidfield.set(s, "s666");
Object obj =sidfield.get(s);
System.out.println(obj);
}
}
8.反射的动态调用方法
package com.houzhihong.demo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo4 {
//动态调用方法
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Student s= new Student();
s.setSname("打车");
System.out.println(s);
//反射机制实例化
Class c1 =Class.forName("com.demo.Student");
Method method= c1.getMethod("hello", new Class[] {String.class});
method.invoke(s, "滴滴");
//调用私有方法
Method method2= c1.getDeclaredMethod("add", Integer.class,Integer.class);
method2.setAccessible(true);
Integer i =(Integer) method2.invoke(s, 50,50);
System.out.println(i);
}
}