反射简单分析

1.什么是反射?

反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。

2.如何得到类对象

一切反射相关的代码都从获得类对象开始
3种获取方式:
2.1 类名.class;
2.2 对象名.getClass();
2.3 Class.forName(全限定名/全路径名);
//实例化对象
//1.传统方式的实例化对象
Student stu=new Student();
//2.反射机制实例化对象
Object obj = cla.newInstance();
注意:
1)ClassNotFoundException 类未找到|缺少Jar包
2)同一个类,类对象只会被加载一次

3.根据类得到类名(全限定名/全路径名)

1)cName.getName(); -->获取全限定名
2)cName.getSimpleName(); -->获取类名
3)cName.getPackage(); -->获取包名

4.根据类得到类的属性

Field field=cla.getField(“属性名”);

field.getName(); -->获取属性名
filed.getType(); -->获取属性类型
field.getModifiers(); -->获取属性访问修饰符
field.set(Object,Object); -->设置属性值,参数1:要设置属性所在对象;参数2:要设置的值;
field.get(Object); -->获取属性值,参数:要获取属性值的对象
field.getDeclaredField(“属性名”); -->获取单个属性(私有、公有、受保护、默认、静态)
field.getDeclaredFields(); -->获取所有属性(私有、公有、受保护、默认、静态)

5.根据类得到类的方法

cla.getMethod(); -->获取单个公有方法
cla.getDeclaredMethod(); -->获取当个方法(包括私有、受保护、默认、公有)
cla.getMethods(); -->获取所有公有方法
cla.getDeclaredMethods(); -->获取所有的方法(包括私有、受保护、默认、公有)

invoke 执行调用方法

6.根据类得到类的构造方法

cla.getConstrutor(); -->获取单个公有构造方法
cla.getDeclaredConstrutor(); -->获取单个构造方法(包括私有、受保护、默认、公有)
cla.getConstrutors(); -->获取所有的公有构造方法
cla.getDeclaredConstrutors(); -->获取所有的构造方法(包括私有、受保护、默认、公有)
newInstance 执行调用构造方法

7.根据类得到类的实现接口列表

Class[] interface=cla.getInterfaces(); -->获取类对象中所有实现接口列表

三种获取类对象方式

package com.zhouzhuolin.reflect.test;

public class Demo1 {
	
	public static void main(String[] args) throws Exception {
		
//		一切与反射相关的代码都从获取类对象开始
//		1.获取类对象的3中方式;
//		1.1Class.forName获取类对象
		Class cla= Class.forName("com.zking.reflect.test.Student");
		System.out.println("获取类对象的全路径名 或者全类名:"+cla.getName());
		System.out.println("获取类对象的名字:"+cla.getSimpleName());
		System.out.println("获取类对象的包名:"+cla.getPackage());
		
//		2.对象名.getClass
		Student stu=new Student();
		Class cla1=stu.getClass();
		System.out.println(cla1);
		
//		3.类名.class
		Class cla2=Student.class;
		System.out.println(cla2);
	}	
		
}		

测试结果

在这里插入图片描述

获取单个的公共属性

反射获取类对象属性值field

Class cla = Class.forName("com.zking.reflect.test.Student");
		
//		1.反射获取类对象属性值field
//		1.1获取单个的公共属性
		Field field = cla.getField("age");
		System.out.println("获取属性名:"+field.getName());
		System.out.println("获取属性的访问修饰符:"+field.getModifiers());
		System.out.println("获取属性的类型:"+field.getType());

测试结果

在这里插入图片描述

获取单个私有,公开,静态,最终,受保护的属性;

		Class cla = Class.forName("com.zking.reflect.test.Student");

		Field declaredField = cla.getDeclaredField("sname");
		System.out.println("获取属性名:"+declaredField.getName());
		System.out.println("获取属性的访问修饰符:"+declaredField.getModifiers());
		System.out.println("获取属性的类型:"+declaredField.getType());

测试结果

在这里插入图片描述

获取所有的公共属性

		Field[] fields = cla.getFields();
		System.out.println(fields.length);

获取所有的私有,公开,静态,最终,受保护的属性;

		Field[] declaredFields = cla.getDeclaredFields();
		System.out.println(declaredFields.length);

获取单个公共方法

//		2.1获取单个公共方法 参数name:方法名,parameterTypes 方法参数,可变参数
//		方法分四种 有参返回,有参无返回,无参有返回,无参无返回
		Method method2 = cla.getMethod("setSname", String.class);
		method2.invoke(obj, "张三");
		
		Method method=cla.getMethod("hello", null);		
//		invoke方法 参数1 类的实例化对象
		method.invoke(obj, null);

测试结果

在这里插入图片描述

获取单个私有,公开,静态,最终,受保护的方法

		Method declaredMethod = cla.getDeclaredMethod("add", Integer.class,Integer.class);
		declaredMethod.setAccessible(true);
		Object jg = declaredMethod.invoke(obj, 10,11);
		System.out.println(jg);

测试结果

在这里插入图片描述

获取所有的公共方法

		Method[] methods = cla.getMethods();
		for (Method method3 : methods) {
			System.out.println(method3.getName());
		}
		System.out.println(methods.length);

测试结果

在这里插入图片描述

获取所有私有,公开,静态,最终,受保护的方法

		Method[] methods2 = cla.getDeclaredMethods();
		for (Method method3 : methods2) {
			System.out.println(method3.getName());
		}
		System.out.println(methods2.length);

测试结果

在这里插入图片描述

获取单个公共的构造方法

		Constructor con1 = cla.getConstructor(null);
		con1.newInstance(null);
		
		Constructor con2 = cla.getConstructor(String.class);
		con2.newInstance("张三");
		
		Constructor con3 = cla.getConstructor(String.class,String.class);
		con3.newInstance("1","2");

测试结果

在这里插入图片描述

获取单个私有,公开,静态,最终,受保护的方法

		Constructor cont = cla.getDeclaredConstructor(Integer.class);
		cont.setAccessible(true);
		cont.newInstance(10);

测试结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值