反射的应用

概述

        反射其实就是类对象,类加载的产物;将类加载到内存中,会产生类对象(class文件);有了类对象,即可得到所有类资源的信息: 类,方法,属性,构造器,包,父类,接口...

创建类对象

可以通过三种方式获取类对象:1.类名.class 2.对象.getClass() 3.Class.forName("全限定名");

结论:无论哪种方式获取的类对象都是同一个类对象

//1.通过类名获取类对象
Class<?> c1 = Person.class;  //<?>:通配所有类型,用在接收数据据时

Class c2 = new Person().getClass();

Class c3 = Class.forName("com.qf.f_reflect.Person");

System.out.println(c1==c2); //true
System.out.println(c1==c3); //true

常用方法

//反射的相关方法
Class c1 = Student.class;  //获取反射对象
System.out.println("获取类名:"+c1.getName());
System.out.println("获取包名:"+c1.getPackage());
System.out.println("获取父类:"+c1.getSuperclass());
System.out.println("获取接口:"+Arrays.toString(c1.getInterfaces()));

//getField或getFields获取公开的属性的
System.out.println("获取属性:"+Arrays.toString(c1.getFields()));
//System.out.println("获取指定属性:"+c1.getField("name"));

//获取非空开属性;甚至放开权限后,私有的也可以获取
System.out.println("获取属性2:"+Arrays.toString(c1.getDeclaredFields())); //常用

System.out.println("获取方法:"+Arrays.toString(c1.getMethods())); //常用
//参数1:方法名  参数2:多个参数
System.out.println("获取指定方法:"+c1.getMethod("hi",String.class,int.class));
System.out.println("获取构造器:"+Arrays.toString(c1.getConstructors()));
System.out.println("实例化对象:"+c1.newInstance()); //(常用)

反射的应用

调属性

class Student {
	public void hello(String name,int age) {
		System.out.println("姓名:"+name+";年龄:"+age);
	}
	public void test() {
	}
}
public class Test2 {
	public static void main(String[] args) throws Exception {
		//类对象调方法:
		//1.获取类对象
		Class c1 = Student.class;
		//2.获取Method对象
		Method method = c1.getMethod("hello", String.class,int.class);
		//3.调用invoke方法
		method.invoke(c1.newInstance(), "zs",33);
	}
}

调方法

class Student {
	public void hello(String name,int age) {
		System.out.println("姓名:"+name+";年龄:"+age);
	}
	public void test() {
	}
}
public class Test2 {
	public static void main(String[] args) throws Exception {
		//类对象调方法:
		//1.获取类对象
		Class c1 = Student.class;
		//2.获取Method对象
		Method method = c1.getMethod("hello", String.class,int.class);
		//3.调用invoke方法
		method.invoke(c1.newInstance(), "zs",33);
	}
}

应用场景

反射应用,往往可以灵活动态的调用属性,方法,构造方法

在程序中,使用了反射,可以使程序的维护性更强

public class caogao {
	public static void main(String[] args) throws Exception{
		A a = Factory.getMsg(A.class, "zs", 13);
		B b = Factory.getMsg(B.class, "ls", 14);
		System.out.println(a+"=="+b);
	}
}


class Factory{
public static<T> T getMsg(Class<T> c1,String name,int age) throws Exception {
	Field field1 = c1.getDeclaredField("name");
	Field field2 = c1.getDeclaredField("age");
	field1.setAccessible(true);
	field2.setAccessible(true);
	T t = c1.newInstance();
	field1.set(t, name);
	field2.set(t, age);
	Method method = c1.getMethod("a");
	method.invoke(t);
	return t;
	
	
}
}

class A {
	String name ;
	 int age;
	 public void a() {
		System.out.println("成功a");
	}
	@Override
	public String toString() {
		return "A [name=" + name + ", age=" + age + "]";
	}
	 
}

class B {
	String name ;
	 int age;
	 public void a() {
		System.out.println("成功b");
	}
	@Override
	public String toString() {
		return "B [name=" + name + ", age=" + age + "]";
	}
	 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值