栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java基础-反射介绍

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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);
	}
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/709554.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号