反射

基本概念

什么是反射?
  java反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射机制的实现实质:Class

Class类的创建

Class类的实例表示正在运行java应用程序中的类和接口
Class类的对象获取:
  1、getClass()
   2、.class
   3、forName(String className)
类的完全限定名/全名:指src下开始的包的路径
类的简名:没有包名的名称
forName方法 参数必须为类的完全限定名。并且要求类是存在的。否则会报类找不到异常
Class类的实例创建对象
  1、newInstance() 创建Class类的对象表示的内个类的对象。返回值是Object类型 需要强制类型转换。
注意: 该方法调用的是无参构造。建议类中如果有有参构造,就必须要提供无参构造
2、 getConstructors() 返回所有的公共的构造方法
3、getConstructor(Class<?>… parameterTypes)返回指定的构造方法,其中 参数表示 构造方法中参数的数据类型的Class类的对象
4、newInstance(Object… initargs) 根据参数值来创建有参构造对应的对象,其中 参数表示实参
5、getDeclaredConstructors() /getDeclaredConstructor(Class<?>… parameterTypes) 返回声明的构造方法,不管是私有 还是public修饰 都可以,只要在类中声明的都算
6、setAccessible(true) 当参数为true ,表示打开访问权限

public class 反射之Class类的创建 {
	public static void main(String[] args) throws Exception {
		//获取class类的对象
		Class clazz = Perss.class;
		//创建Perss类的对象
		Perss per = (Perss) clazz.newInstance();
		//返回公共构造方法
		Constructor[] constructors = clazz.getConstructors();
		for (Constructor constructor : constructors) {
			System.out.println(constructor);
		}
		//返回所有构造方法(私有和公有)
		Constructor[] AllConstructors = clazz.getDeclaredConstructors();//
		for (Constructor constructor : AllConstructors) {
			System.out.println(constructor);
		}
		//返回私有有参构造方法
		Constructor oneConstructor = clazz.getDeclaredConstructor(String.class);
		//反射获取的有参构造方法的使用
		//暴力反射,打开访问权限
		oneConstructor.setAccessible(true);
		Perss p2 = (Perss) oneConstructor.newInstance("李四");
		System.out.println(p2);
		//获取公共的有参构造
		Constructor twoconstructor = clazz.getConstructor(String.class,int.class);
		//通过有参构造创建对象
		Perss p3 = (Perss) twoconstructor.newInstance("张三",20);
		System.out.println(p3);
	}
}
class Perss{
	String name;
	int age;
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public Perss() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Perss(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	private Perss(String name) {
		super();
		this.name = name;
	}
	public void fun() {
		System.out.println("这是Person类中的方法。。。。");
	}
}

属性的获取

Filed 字段 属性
常用方法:
① getField(String name) /getFields() 获取公共的字段
② getDeclaredField(String name) /getDeclaredFields() 获取声明的字段 包括private
其中 name表示字段的名称。
③ set(Object obj, Object value) 将obj对象的该字段设置为value值。
④ get(Object obj) 返回obj对象上该字段的值,返回类型为Object

public class 反射之属性的获取 {

	public static void main(String[] args) throws Exception {
		//获取per类的Class对象
		Class clazz = Per.class;
		//获取name字段(属性)
		Field name = clazz.getDeclaredField("name");
		//对于字段(属性)来说,需要属于某个对象,所以要先创建对象
		Per p = (Per) clazz.newInstance();
		//设置p对象name属性的值
		//打开访问权限
		name.setAccessible(true);
		name.set(p, "张三");
		//输出  看效果
		System.out.println(p);
		//获取p对象name属性中的值
		String pName = (String) name.get(p);
		System.out.println(pName);
		//获取age属性
		Field age = clazz.getDeclaredField("age");
		//设置p对象的age属性,age属于public,不需要打开访问权限,直接设置
		age.set(p, 20);
		//输出
		System.out.println(p);
		//获取p对象age属性的值
		int pAge = (int) age.get(p);
		//输出
		System.out.println(pAge);
		//getModifiers() 权限修饰符 返回值 int类型
		System.out.println(age.getModifiers());
		//getType() 返回字段的声明的数据类型
		System.out.println(name.getType());
	}

}
class Per{
	private String name;
	public int age;
	@Override
	public String toString() {
		return "per [name=" + name + ", age=" + age + "]";
	}
}

反射的常用方法

1.Method 方法
2.常用方法 :
① getMethod(String name, Class<?>… parameterTypes) /getMethods()
② getDeclaredMethod(String name, Class<?>… parameterTypes) /getDeclaredMethods()
③ invoke(Object obj, Object… args) 方法的调用
其中 obj表示哪个对象的方法,args表示该方法的实参值。该方法的返回值就是需要调用的内个方法的返回值。
如果没有参数,可以使用null表示或者不写。当方法没有返回值时,invoke方法的返回值为nul

public class 反射的方法 {

	public static void main(String[] args) throws Exception {
		//获取Pers类的class对象
		Class clazz = Pers.class;
		//创建Pers类的对象
		Pers p = (Pers) clazz.newInstance();
		//获取Pers类的方法
		Method fun = clazz.getMethod("fun", int.class,String.class);
		//方法调用
		fun.invoke(p, 19,"张三");
		Object res = fun.invoke(p, 20,"李四");
		System.out.println(res);
		//无参方法,参数值为null
		Method fun1 = clazz.getMethod("fun1", null);
		fun1.invoke(p, null);
		//静态方法 调用时,对象可以使用null。
		Method sf = clazz.getMethod("sf", null);
		sf.invoke(null, null);
		sf.invoke(null);
	}

}
class Pers{
	public String fun(int age,String name) {
		System.out.println(age+"===="+name);
		return age+":"+name;
	}
	public void fun1() {
		System.out.println("aaaaaa");
	}
	public static void sf() {
		System.out.println("bbbb");
	}
}

其它方法

1.getInterfaces() 返回父接口,数组
2.getSuperclass() 返回父类

public class 反射的其它方法 {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		Class clazz = Zi.class;
		//创建对象
		Zi z = (Zi) clazz.newInstance();
		//返回父类接口、数组
		Class[] arr = clazz.getInterfaces();
		for (Class class1 : arr) {
			System.out.println(class1);
		}
		Class arr2 = clazz.getSuperclass();
		System.out.println(arr2);
	}

}
interface X{
	public void fun();
}
interface X1 {
	public void fun1();
}
class V{
	
}
class  Zi  extends V implements  X,X1{

	@Override
	public void fun1() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void fun() {
		// TODO Auto-generated method stub
		
	}	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值