java---反射(重点)

2023-10-17 09:09:03 浏览数 (1)

类似于自己照镜子,镜子中有自己的投影。就是像一个类在照镜子,通过一个对象,一个类名,这个类内部的结构就能清晰的看出来。反射有一个类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());
    }
}

0 人点赞