反射的笔记

获取反射的六种方式

1.已知一个类全名 Class.forName(classAllpath) 多用于读取配置文件

		String classAllpath = "lesson02.Cat";
		Class cls1 = Class.forName(classAllpath);
		System.out.println(cls1);// class lesson02.Cat

2.类.class 多用于参数传递

		Class cls2 = Cat.class;
		System.out.println(cls2);// class lesson02.Cat

3.对象名.getClass()

		Cat cat = new Cat();
		Class cls3 = cat.getClass();
		System.out.println(cls3);// class lesson02.Cat

4.通过类加载器来获取

		ClassLoader classLoader = cat.getClass().getClassLoader();
		Class cls4 = classLoader.loadClass(classAllpath);
		System.out.println(cls4);// class lesson02.Cat

5.基本数据类型.class

		Class<Integer> integerClass = int.class;
		System.out.println(integerClass);// int

6.包装类.TYPE

		Class<Integer> type = Integer.TYPE;
		System.out.println(type);// int

常用的方法

getClass() 显示运行类型

		System.out.println(cls1.getClass());// class java.lang.Class

getName() 获取…的名

		System.out.println(cls1.getName());// lesson02.Cat

getSimpleName() 获取简单类名

		System.out.println(cls1.getSimpleName());// Cat

getPackage() 显示包

		System.out.println(cls1.getPackage().getName());// lesson02

newInstance() 通过反射创建对象实例

		Object o = cls1.newInstance();
		Cat cat1 = (Cat)cls1.newInstance();
		System.out.println(cat1);// Cat [name=招财猫, age=10]

getField(" ") 获取某个属性值 只能获取public修饰的 set(对象,值)修改某个属性的值

		Field age = cls1.getField("age");// 通过反射获取属性值
		System.out.println(age.get(cat1));// 属性.get(对象) 10
		age.set(cat1, 20);// 改变age的值
		System.out.println(age.get(cat1))// 20

getFields() 获取属性数组 包括本类以及父类 只能获取public修饰的属性

		Field[] fields = cls1.getFields();
		for (Field field : fields) {
			System.out.println(field.getName());
		}// name age 父类的属性hobby

getDeclaredFields()获取本类中所有属性

		Field[] declareField = cls1.getDeclaredFields();
		for (Field field : declareField) {
			System.out.println("本类所有属性:" + field.getName());
		}// name age ID gender job

getMethods() 获取public修饰的方法 包含本类及父类 及父类的父类

		Method[] methods = cls1.getMethods();
		for (Method method : methods) {
			System.out.println("本类及父类的方法:" + method);
		}// cry 父类的m3方法 以及Object类的方法

getDeclaredMethods() 获取本类中所有方法

		Method[] declaredMethods = cls1.getDeclaredMethods();
		for (Method declaredMethod : declaredMethods) {
			System.out.println("本类中所有方法:" + declaredMethod.getName());// cry hi m1 m2 toString
		}

getConstructor(xx.class,xx.class)获取某个public构造器

		Constructor constructor = cls1.getConstructor(String.class,int.class);
		System.out.println(constructor);// public lesson02.Cat(java.lang.String,int)

getConstructors()获取本类的public修饰的构造器

		Constructor[] constructors = cls1.getConstructors();
		for (Constructor constructor2 : constructors) {
			System.out.println("本类的构造器=" + constructor2);
		}// Cat() Cat(java.lang.String,int)

getDeclaredConstructors() 获取本类中所有构造器

		Constructor[] declaredConstructors = cls1.getDeclaredConstructors();
		for (Constructor constructor2 : declaredConstructors) {
			System.out.println("本类所有的构造器=" + constructor2);
		}// private lesson02.Cat(int)
		//	public lesson02.Cat(java.lang.String,int)
		//	public lesson02.Cat()

getSuperclass() 获取父类的class

		System.out.println("父类的class=" + cls1.getSuperclass());
		//父类的class=class lesson02.D

getInterfaces() 返回接口信息

		Class[] interfaces = cls1.getInterfaces();
		for (Class aninterface : interfaces) {
			System.out.println(aninterface);
		}
		// interface lesson02.IA
		// interface lesson02.IB

getAnnotations() 返回注解信息

		Annotation[] annotations = cls1.getAnnotations();
		for (Annotation annotation : annotations) {
			System.out.println("注解信息=" + annotation);
		}// 注解信息=@java.lang.Deprecated()

getModifiers()以int形式返回访问修饰符 默认修饰符是0 public是1 private是2 protected是4 static是8 final是16 修饰符的值可相加

		declareField = cls1.getDeclaredFields();
		for (Field field : declareField) {
			System.out.println("本类所有属性:" + field.getName() + "该属性的访问修饰符=" + field.getModifiers());
		}
		// 本类所有属性:name该属性的访问修饰符=1
		// 本类所有属性:age该属性的访问修饰符=1
		// 本类所有属性:ID该属性的访问修饰符=2
		// 本类所有属性:gender该属性的访问修饰符=4
		// 本类所有属性:job该属性的访问修饰符=0

getType()返回该属性的类型

		declareField = cls1.getDeclaredFields();
		for (Field field : declareField) {
			System.out.println("本类所有属性:" + field.getName() + "该属性的访问修饰符=" + field.getModifiers() + "该属性的类型=" + field.getType());
		}
		// 该属性的类型=class java.lang.String
		// 该属性的类型=int
		// 该属性的类型=int
		// 该属性的类型=class java.lang.String
		// 该属性的类型=class java.lang.String

getReturnType()返回 方法的返回类型

		declaredMethods = cls1.getDeclaredMethods();
		for (Method declaredMethod : declaredMethods) {
			System.out.println("本类中所有方法:" + declaredMethod.getName() + "该方法的访问修饰符=" + declaredMethod.getModifiers() + "该方法返回类型" + declaredMethod.getReturnType());
		}
		本类中所有方法:toString该方法的访问修饰符=1该方法返回类型class java.lang.String
		// 本类中所有方法:cry该方法的访问修饰符=1该方法返回类型void
		// 本类中所有方法:m1该方法的访问修饰符=4该方法返回类型void
		// 本类中所有方法:m2该方法的访问修饰符=2该方法返回类型void
		// 本类中所有方法:hi该方法的访问修饰符=0该方法返回类型void

getParameterTypes() 返回这个方法/构造器的形参数组

创建实例的三种方法

1.通过public的无参构造器创建实例

		Class cls = Class.forName("lesson02.User_");
		Object o = cls.newInstance();
		System.out.println(o);// User_ [age=10, name=张三]

2.通过public的有参构造器创建实例

		Constructor constructor = cls.getConstructor(String.class);
		Object o1 = constructor.newInstance("李四");
		System.out.println(o1);// User_ [age=10, name=李四]

3.通过非public的有参构造器创建实例

		Constructor constructor1 = cls.getDeclaredConstructor(int.class,String.class);
		constructor1.setAccessible(true);// 暴破 使用反射可以访问private构造器
		Object o2 = constructor1.newInstance(100,"王二");
		System.out.println(o2);// User_ [age=100, name=王二]

通过反射访问类中成员

1.访问public成员

		Class cls = Class.forName("lesson02.Student02");
		Object o = cls.newInstance();
		Field age = cls.getField("age");
		age.set(o, 88);
		System.out.println(o);// Student02 [age=88,namenull]
		System.out.println(age.get(o));// 88

2.访问非public成员

		Field name = cls.getDeclaredField("name");
		name.setAccessible(true);
		name.set(o, "张三");
		System.out.println(o);// Student02 [age=88,name张三]

3.访问静态成员时,get和set中的参数o可以写成null

		name.set(null, "李四");
		System.out.println(o);// Student02 [age=88,name李四]
		System.out.println(name.get(null));// 李四

通过反射访问方法时

1.访问public方法

		Class cls = Class.forName("lesson02.Boss");
		Object o = cls.newInstance();
		Method hi = cls.getMethod("hi",String.class);
		hi.invoke(o, "反射要结束了");// hi反射要结束了

2.访问非public方法

		Method say = cls.getDeclaredMethod("say", int.class,String.class,char.class);
		say.setAccessible(true);
		System.out.println(say.invoke(o, 100,"张三",'a'));
		// 100张三a

3.访问静态方法

		System.out.println(say.invoke(null, 200,"李四",'b'));
		// 200李四b

在反射中,如果方法有返回值,统一返回Object,但是运行类型和方法中定义的放回类型一致

		Object return_ = say.invoke(null, 300,"王二",'c');
		System.out.println("运行类型是:" + return_.getClass());
		// 运行类型是:class java.lang.String
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值