Java反射

时间:2022-07-25
本文章向大家介绍Java反射,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Java反射

反射:框架设计的灵魂 框架:半成品,可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他的对象,这就是反射机制 好处: 1.可以在程序的运行过程中,操作这些对象 2.可以解耦,提高程序的可拓展性

下面我们用一张图来讲述java的反射机制

由图可见将类的各个组成部分封装为一个个对象,成员变量封装为field对象,构造方法封装为con对象,成员方法封装围为method对象

获取Clss对象的三种方式

  1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象 * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
  2. 类名.class:通过类名的属性class获取 * 多用于参数的传递
  3. 对象.getClass():getClass()方法在Object类中定义着。 * 多用于对象的获取字节码的方式

代码

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> person = Class.forName("Reflect.Person");
        System.out.println(person);
        Class<Person> personClass = Person.class;
        System.out.println(personClass);
        Person person1 = new Person();
        Class<? extends Person> aClass = person1.getClass();
        System.out.println(aClass);
    }
}

结果

可见一个类,在一次运行过程中只会被加载一次

那么class对象有什么用呢?

获取功能: 1. 获取成员变量们 * Field[] getFields() :获取所有public修饰的成员变量 * Field getField(String name) 获取指定名称的 public修饰的成员变量

			* Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符
			* Field getDeclaredField(String name)  
package Reflect;
import java.lang.reflect.Field;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取class对象
        Class<Person> personClass = Person.class;
        //使用getFields方法获取public修饰的方法
        Field[] fields = personClass.getFields();
        System.out.println("getFields方法:");
        //获取public修饰的成员变量
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("getDeclaredFields方法:");
        //使用getDeclareFields方法获取全部成员变量
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
    }
}

结果:

		2. 获取构造方法们
			* Constructor<?>[] getConstructors()  
			* Constructor<T> getConstructor(类<?>... parameterTypes)  

			* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)  
			* Constructor<?>[] getDeclaredConstructors()  
package Reflect;
import java.lang.reflect.Constructor;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取class对象
        Class<Person> personClass = Person.class;
        //获取public 修饰的构造方法
        Constructor<?>[] constructors = personClass.getConstructors();
        System.out.println("Public修饰的构造方法:");
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
        //获取所有构造方法
        System.out.println("所有构造方法:");
        Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
    }
}

结果:

		3. 获取成员方法们:
			* Method[] getMethods()  
			* Method getMethod(String name, 类<?>... parameterTypes)  

			* Method[] getDeclaredMethods()  
			* Method getDeclaredMethod(String name, 类<?>... parameterTypes)  

		4. 获取全类名	
			* String getName()  
			* 
package Reflect;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取class对象
        Class<Person> personClass = Person.class;
        //获取全类名
        String name = personClass.getName();
        System.out.println(name);
    }
}

结果

Field:成员变量 * 操作: 1. 设置值 * void set(Object obj, Object value) 2. 获取值 * get(Object obj)

		3. 忽略访问权限修饰符的安全检查
			* setAccessible(true):暴力反射

Constructor:构造方法 创建对象: * T newInstance(Object... initargs)

		* 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
package Reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
       //获取class对象
        Class<Person> personClass = Person.class;
        Person person = new Person();
        Constructor<Person> one = personClass.getConstructor(String.class, int.class);
        System.out.println(one);
        //构造方法1
        System.out.println("构造方法1:");
        Person zhangsan = one.newInstance("zhangsan", 11);
        System.out.println(zhangsan);
        System.out.println("构造方法2:");
        Person person2 = personClass.newInstance();
        System.out.println(person2);
    }
}

结果

Method:方法对象 执行方法: Object invoke(Object obj, Object... args)

	 获取方法名称:
		 String getName:获取方法名

以上就是java反射的一些基础知识,如有错误还请各位批评指正,喜欢我的可以点赞收藏,也可以关注呀