Java基础-反射介绍

Java基础-反射介绍,第1张

Java基础-反射介绍 一、什么是反射?

能分析类信息的能力叫做反射。

二、反射是如何工作的

三、如何获取class对象

 

四、 class对象的功能

class类

public class Dog {
	private Integer age = 18;
	public String name = "大雄";
	protected Character sex = '男';
	String eat = "站着吃";

	public void run() {
		System.out.println("大雄跑的很快");
	}

	public void eat() {
		System.out.println("大雄吃的很多");
	}

	private void flog(String name) {
		System.out.println(name + "会飞");
	}

	
	public Dog() {
		
	}
	private Dog(int age, String name, char sex) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Character getSex() {
		return sex;
	}

	public void setSex(Character sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "Dog{" + "age=" + age + ", name='" + name + ''' + ", sex=" + sex + '}';
	}
}
一、关于全局变量

1.关于获取全局变量

类对象名称.getFields()         Field[]数组进行接收 只能获取由public修饰的变量

类对象名称.getDeclaredFields()         Field[]数组进行接收 获取所有的变量

类对象名称.getField("指定变量")         Field进行接收 只能获取由public修饰的指定变量

类对象名称.getDeclaredField("指定变量")         Field进行接收 获取到指定的变量(所有变量中)

2.Field成员变量的基本 *** 作

1.设置值set(Object obj,Object value)

        ①:new出我们对象:我们需给赋的值内存空间进行表达

        ②:判断我们所获取的变量是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);

        ③:调用set()方法,传递两个参数,第一个是我们new出的对象,第二个是我们想要赋的值 2.获取值get(Object obj)

        ①:new出我们对象:我们需给赋的值内存空间进行表达

        ②:判断我们所获取的变量是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);

        ③:调用get()方法并且将创建出来的对象当成参数进行传递,用Object来进行返回值的接收

import java.lang.reflect.Field;

public class Test2 {
    public static void main(String[] args) throws Exception {
		// class.forName("全类名")
		Class class1 = Class.forName("com.qcby.Fs.Dog");

		// 变量
		Field[] fields = class1.getFields();
		for (Field field : fields) {
			System.out.println(field);
		}
		System.out.println("---------------------------------");
		Field[] fields1 = class1.getDeclaredFields();
		for (Field field : fields1) {
			System.out.println(field);
		}
		System.out.println("---------------------------------");

		Field fieldName = class1.getField("name");
		System.out.println(fieldName);
		Dog dog = new Dog();
		fieldName.set(dog, "大雄");
		Object o = fieldName.get(dog);
		System.out.println(o);

		System.out.println("---------------------------------");

		Field fieldAge = class1.getDeclaredField("age");
		System.out.println(fieldAge);
		Dog dog1 = new Dog();
		fieldAge.setAccessible(true);//暴力反射
		fieldAge.set(dog1, 20);
		Object o1 = fieldAge.get(dog1);
		System.out.println(o1);
    }
}

 

二、关于方法

1.关于获取方法

类对象名称.getMethods()         Method[]数组进行接收 只能获取由public修饰的方法

类对象名称.getDeclaredMethods()         Method[]数组进行接收 获取所有的方法

类对象名称.getMethod("指定方法名称",参数类型.class……)         Method进行接收 只能获取由public修饰的指定方法

类对象名称.getDeclaredMethod("指定方法名称",参数类型.class……)         Method进行接收 获取到指定的方法(所有方法中)         

 2.关于对方法 *** 作         invcke() //对方法的执行

        ①:new出我们对象:我们需给赋的值内存空间进行表达

        ②:判断我们所获取的方法是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);

        ③:调用invcke()方法,传递两个参数,第一个是我们new出的对象,第二个是我们想要赋的值

import java.lang.reflect.Method;

public class Test2 {
	public static void main(String[] args) throws Exception {
		// class.forName("全类名")
		Class class1 = Class.forName("com.qcby.Fs.Dog");
		// 方法
		Method[] m1 = class1.getMethods();
		for (Method method : m1) {
			System.out.println(method);
		}
		System.out.println("---------------------------------------");
		Method[] m2 = class1.getDeclaredMethods();
		for (Method method : m2) {
			System.out.println(method);
		}
		Dog dog = new Dog();
		Method Mdog = class1.getMethod("run");
		Mdog.invoke(dog);

		Dog dog2 = new Dog();
		Method Mdog2 = class1.getDeclaredMethod("flog", String.class);
		Mdog2.setAccessible(true);//暴力反射
		Mdog2.invoke(dog2, "张二麻子");
    }
}

三、关于构造器

1.关于获取构造器

类对象名称.getConstructors()         Constructor[]数组进行接收 只能获取由public修饰的构造器

类对象名称.getDeclaredConstructors()         Constructor[]数组进行接收 获取所有的构造器

类对象名称.getConstructor(参数类型.class ...)         Constructor进行接收 只能获取由public修饰的指定构造器

类对象名称.getDeclaredConstructor(参数类型.class ...)         Constructor进行接收 获取到指定的构造器(所有构造器中)

2.关于对构造器 *** 作 newInstance(参数值.....) 创建对象

        ①:new出我们对象:我们需给赋的值内存空间进行表达

        ②:判断我们所获取的构造器是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);

        ③:newInstance(参数值.....),传递参数,我们想要赋的值

import java.lang.reflect.Constructor;

public class Test2 {
	public static void main(String[] args) throws Exception {
		// class.forName("全类名")
		Class class1 = Class.forName("com.qcby.Fs.Dog");

		// 构造器
		Constructor[] C1 = class1.getConstructors();
		for (Constructor constructor : C1) {
			System.out.println(constructor);
		}
		Constructor[] C2 = class1.getDeclaredConstructors();
		for (Constructor constructor : C2) {
			System.out.println(constructor);
		}

		Constructor C3 = class1.getConstructor();
		Object o = C3.newInstance();
		System.out.println(o);

		Constructor C4 = class1.getDeclaredConstructor(int.class, String.class, char.class);
		C4.setAccessible(true);//暴力反射
		Object o1 = C4.newInstance(12, "小卡", '女');
		System.out.println(o1);
	}
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5708096.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存