类似于自己照镜子,镜子中有自己的投影。就是像一个类在照镜子,通过一个对象,一个类名,这个类内部的结构就能清晰的看出来。反射有一个类Class类 ,小写class是在定义类。大写Class是一个类。反射类,可以通过反射类的对象去获取一个类中的所有属性,方法,注解,构造,父类 ,接口.....所有东西,无论公共还是私有。反射在框架中会大量使用,这里是一个重点。
Class类 对象 代表是具体要去映射哪个类。
20.1 创建对象
1、对象名.getClass();
2、类名.class;
3、Class.forName("完全限定名") 完全限定名(全类名): com.qf.entitys.Student
代码语言:javascript复制Class c1= Student.class;
Student stu=new Student();
Class c2=stu.getClass();
try {
Class c3=Class.forName("com.qf.lambdaDemo.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
使用Class对象获取反射类型的类名
代码语言:javascript复制public class ClassDemo {
public static void main(String[] args) {
Student stu=new Student();
Class c2=stu.getClass();
//类名
System.out.println(c2.getSimpleName());
//全类名
System.out.println(c2.getName());
}
}
Field 类 反射技术中用于描述属性
代码语言:javascript复制package com.qf;
import com.qf.lambdaDemo.Student;
import java.lang.reflect.Field;
public class ClassDemo {
public static void main(String[] args) {
Student stu=new Student(1,"张鹏","男","13312345678","重庆市沙坪坝区",3.14);
Class c2=stu.getClass();
System.out.println(c2.getSimpleName());
System.out.println(c2.getName());
Field[] declaredFields = c2.getDeclaredFields();
for (Field f: declaredFields){
f.setAccessible(true); //不进行私有安全检查
System.out.println(f.getName());
try {
System.out.println(f.get(stu));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
c.getField("属性名"); 根据属性名获取单个公共的属性
c.getFields(); 获取指定类所有的公共的属性
c.getDeclaredField("属性名"); 根据属性名获取属性,无视访问修饰符
c.getDeclaredFields(); 获取指定类所有的属性
这些方法的返回值是Field类型获取个就是一个对象,多个就是Field[]数组。
20.2 Field类
getName() 获取属性名
get(target) 获取属性值 target哪个对象中的属性值 f.get() 表示获取值,并没有说明要获取哪个对象的这个属性值。
setAccessible(true) /不进行私有安全检查
set(Object,Value); 向指定的对象设置对应的值 orm框架的基础 (实体对象关系映射框架)
代码语言:javascript复制import com.qf.entitys.Student;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
public class Demo1 {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException {
//ORM框架 关系映射 mybatis -->
Map<String,Object> map=new HashMap<>();
map.put("id",1);
map.put("name","张鹏");
map.put("sex","男");
map.put("age",22);
map.put("phone","13388889999");
map.put("address","重庆市江北区");
Class c = Student.class;
//根据反射对象创建被反射类的对象
Object o = c.newInstance();//没有值的对象
for (String key:map.keySet()) {
Field f = c.getDeclaredField(key);
f.setAccessible(true);
//set(o,)设置属性值
f.set(o,map.get(key));
}
System.out.println(o.toString());
}
}
20.3 Method
c.getMethod("属性名"); 根据属性名获取单个公共的方法
c.getMethods(); 获取指定类所有的公共的方法
c.getDeclaredMethod("属性名"); 根据属性名获取方法,无视访问修饰符
c.getDeclaredMethods(); 获取指定类所有的方法
代码语言:javascript复制public class Demo3 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class c = Class.forName("com.qf.entitys.Student");
Object o = c.newInstance();
Method[] methods = c.getMethods();
//查看这个类中所有的公共方法
for (Method m: methods) {
System.out.println(m.getName());
}
}
}
Object invoke(target,Object...args)
invoke代表执行这个方法,需要指明由哪个对象去执行,方法的参数是什么(方法的参数要和执行的方法的参数位置,类型一致),如果没有参数invoke方法的第二个参数就写null。返回值是执行目标方法的返回结果,如果目标方法没有返回结果(void) 返回值是一个null。
getMethod(methodName,Class...params);
获取指定名称的方法,第一个参数是名称,第二个参数是目标方法参数的类型,如果目标方法没有参数,可以直接getMethod("show"),如果目标方法有参数,getMethod("show",参数类型.class ...);第二个参数个数,位置也要一一对应。
代码语言:javascript复制import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo3 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class c = Class.forName("com.qf.entitys.Student");
Object o = c.newInstance();
Method show1 = c.getMethod("show");
Method show2 = c.getMethod("show",Integer.class);
Method show3 = c.getMethod("show",Integer.class,Integer.class);
Method show4 = c.getMethod("show",String.class,Double.class);
show1.invoke(o,null);
show2.invoke(o,1);
Object result= show3.invoke(o,2,5);
System.out.println(result);
Object obj = show4.invoke("你好", 3.14);
System.out.println(obj);
}
}
Object o = c.newInstance(); //反射的是什么类,创建的就是那个类的对象,这是一个没有数据的对象相当于
Student o=new Student();
20.4 Constructor
用于表示构造方法
代码语言:javascript复制public class Demo4 {
public static void main(String[] args) {
Class c = Student.class;
Constructor[] constructors = c.getConstructors();
for (Constructor ct : constructors){
System.out.println(ct.getName());
}
}
}
单独获取
调用无参构造,并将数据源中的值,赋值给创建的对象
代码语言:javascript复制public class Demo4 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class c = Student.class;
//c.getConstructor()获取的无参构造
Constructor constructor = c.getConstructor();
//这一步调用无参构造 Class.newInstance() 这两种本质是一样的
Object o = constructor.newInstance();
Map<String,Object> map=new HashMap<>();
map.put("id",1);
map.put("name","张鹏");
map.put("sex","男");
map.put("age",22);
map.put("phone","13388889999");
map.put("address","重庆市江北区");
for (String key:map.keySet()) {
Field f = c.getDeclaredField(key);
f.setAccessible(true);
f.set(o,map.get(key));
}
System.out.println(o.toString());
}
}
调用有参构造:
代码语言:javascript复制import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Demo4 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class c = Student.class;
//c.getConstructor()获取的无参构造
Constructor constructor = c.getConstructor(Integer.class,String.class,String.class,Integer.class,String.class,String.class);
Object o = constructor.newInstance(2, "谢灵儿", "女", 20, "13355556666", "重庆市");
System.out.println(o);
}
}
20.5 Package
代码语言:javascript复制public class Demo5 {
public static void main(String[] args) {
Class c = Student.class;
Package aPackage = c.getPackage();
System.out.println(aPackage.getName());
}
}