Java中反射:框架设计的灵魂

Java中反射:框架设计的灵魂

    框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:
		1. 可以在程序运行过程中,操作这些对象。
		2. 可以解耦,提高程序的可扩展性。
1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
		* 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
	2. 类名.class:通过类名的属性class获取
		* 多用于参数的传递
	3. 对象.getClass():getClass()方法在Object类中定义着。
		* 多用于对象的获取字节码的方式
   深入理解java中==和equals的用法
	* ==号比较两个对象时比较的是两个对象的地址值
	*String 这个类重写了equals这个方法,所以比较的是两个对象的值
public static void main(String[] args) throws Exception {
//    1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
        Class cla = Class.forName("com.entity.Students");
        System.out.println(cla);
        //		2. 类名.class:通过类名的属性class获取
        Class cla1 = Students.class;
        System.out.println(cla1);
        //3. 对象.getClass():getClass()方法在Object类中定义着。
        Students students = new Students();
        Class cla2 = students.getClass();
        System.out.println(cla2);
        System.out.println(cla==cla1);
    }

结果打印:
class com.entity.Students
class com.entity.Students
class com.entity.Students
true

1. 获取成员变量们

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

			* Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符
			* Field getDeclaredField(String name)  
package com.song;

import com.entity.Students;

import java.lang.reflect.Field;

/**
 * @author SongXianYang
 * @date 2020-07-23 11:10:29
 **/
public class MyClass1 {
    /*
    获取功能:
			1. 获取成员变量们
				* Field[] getFields() :获取所有public修饰的成员变量
				* Field getField(String name)   获取指定名称的 public修饰的成员变量

				* Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符
				* Field getDeclaredField(String name)
     */
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class sc = Students.class;
        Field[] fields = sc.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        Students students = new Students();
        Field a = sc.getField("a");
        Object o = a.get(students);
        System.out.println(o);
        a.set(students,"花花大世界");
        System.out.println(students);
        System.out.println("----------------------");
        Field[] declaredFields = sc.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        System.out.println("-----------------");
        Field a1 = sc.getDeclaredField("b");
        a1.setAccessible(true);
        
        Object o1 = a1.get(students);
        System.out.println(o1);
        a1.set(students, "HelloSong");
        System.out.println(students);

    }

}

打印结果为:
rget\classes" com.song.MyClass1
public java.lang.String com.entity.Students.a
null
Students{name='null', age=0, a='花花大世界', b='null'}
----------------------
private java.lang.String com.entity.Students.name
private int com.entity.Students.age
public java.lang.String com.entity.Students.a
private java.lang.String com.entity.Students.b
-----------------
null
Students{name='null', age=0, a='花花大世界', b='HelloSong'}

   Field:成员变量
	* 操作:
		1. 设置值
			* void set(Object obj, Object value)  
		2. 获取值
			* get(Object obj) 
		3. 忽略访问权限修饰符的安全检查
			* setAccessible(true):暴力反射	
		遍历快捷键:
		iter

2. 获取构造方法们

			* Constructor<?>[] getConstructors()  
			* Constructor<T> getConstructor(类<?>... parameterTypes)  

			* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)  
			* Constructor<?>[] getDeclaredConstructors()  
public class MyClass2 {
    /*
    2. 获取构造方法们
				* Constructor<?>[] getConstructors()
				* Constructor<T> getConstructor(类<?>... parameterTypes)

				* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
				* Constructor<?>[] getDeclaredConstructors()
     */
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class sc = Students.class;
        //有参构造
        Constructor constructor = sc.getConstructor(String.class, int.class);
        System.out.println(constructor);
        Object song = constructor.newInstance("song", 12);
        System.out.println(song);
        //无参构造
        Object o = sc.newInstance();
        System.out.println(o);
    }


结果打印;
public com.entity.Students(java.lang.String,int)
Students{name='song', age=12, a='null', b='null'}
Students{name='null', age=0, a='null', b='null'}
 * Constructor:构造方法
	* 创建对象:
		* T newInstance(Object... initargs)  

		* 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法   

3.获取成员方法们与获取全类名

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

			* Method[] getDeclaredMethods()  
			* Method getDeclaredMethod(String name, 类<?>... parameterTypes)
			* 获取全类名	
			* String getName()  
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class sc = Students.class;
        Method eatMethods = sc.getDeclaredMethod("eat");
        Students s = new Students();
        eatMethods.invoke(s);
        System.out.println("------------------------");
        Method eatMethods1 = sc.getDeclaredMethod("eat",String.class);
        eatMethods1.invoke(s,"冰激凌");
        //获取方法名
        String name = eatMethods1.getName();
        System.out.println(name);
        //获取全类名
        //String getName()
        String name1 = sc.getName();
        System.out.println(name1);
    }

结果打印:
喜欢吃-->
------------------------
喜欢吃-->冰激凌
eat
com.entity.Students

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

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

Students

public class Students {
    private String name;
    private int age;
    public String a;
    private String b;
    public Students() {
    }
    public Students(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Students{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                '}';
    }
    public void eat() {
        System.out.println("喜欢吃-->");
    }
    public void eat(String pool) {
        System.out.println("喜欢吃-->"+pool);
    }
}

希望可以帮助到大家,有不对的地方望指正。谢谢

猜你喜欢

转载自blog.csdn.net/weixin_48278764/article/details/107529861