反射Java

发射的概念:

Java发射机制是在运行中,对任意一个类,都可以之到这个类的所有属性与方法,对于任意一个类,都可以调用它的任意一个发发和属性,这种动态获取信息和动态调用对象的方法的功能是Java的反射机制。

要解析一个类,先要获取这个类的字节码文件对象,而解析就是使用类中的方法,所以就先要获得每个字节码文件对应的对象

把Java类中的各种成分映射成一个个Java对象

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

加载执行的时候:Class对象由来原来的Class文件存入内存中,并创建一个Class对象


.java文件-->.class文件这个过程是Java的编译

而反射是反编译就是将.class文件-->.java文件 就是编译成一个JavaBean

在这里我们先创建一个Person类

public class Person {

	public String name;
	
	private int age;
	public    String a;
	
	
	
	
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}

	
	
	public Person(String name, int age, String a) {
		super();
		this.name = name;
		this.age = age;
		this.a = a;
	}



	//无参无返回
	public void  m1() {
		System.out.println("a");
	}
	
	//无参有返回
	public String m2() {
		return "m2";
	}
	
	//有参无返回
	public void m3(Integer i,String str) {
		System.out.println(i);
		System.out.println(str);
	}
	
	//有参有返回
	private String m4(Integer i,String str) {
		return i+str;
	}
}

测试类:

获取类的对象  

	/*
		 * 获取类的对象
		 */
		// 1
		 Class<Person> p= Person.class;
		// 2对象来获取class
		 Person p=new Person();
		// 获取全路径限定名
		 System.out.println(p.getClass());
		// 3得到类的对象
		Class c = Class.forName("com.reflect.Person");
		System.out.println(c);
		// 4
		Class c = Person.class.getClassLoader().loadClass("com.reflect.Person");
		System.out.println(c);

		// 5 得到父类
		Class c = Person.class.getSuperclass();
		System.out.println(c);

		// 6
		Class c = Integer.class;
		System.out.println(c);

第二种后的类的对象(常用)

Class c = Class.forName("com.reflect.Person");
		 //全限定名
		 System.out.println(c.getName());
		 //类名
		 System.out.println(c.getSimpleName());
		 //包名
		 System.out.println(c.getPackage());

属性:公共的属性

Field f= c.getField("name");
		 //得到名称
		 System.out.println(f.getName());
		 //得到修饰符
		 System.out.println(f.getModifiers());
		 //得到数据类型
		 System.out.println(f.getType());
		 //得到Person的对象
		 //newInstance 实例化一个对象
		 Object person= c.newInstance();
		 //赋值
		 f.set(person, "李四");
		// 取值
		 System.out.println(f.get(person));

全部属性:

 Field[] fields = c.getDeclaredFields();
		 Object person = null;
		 for (Field f : fields) {
		 f.setAccessible(true);
		 person = c.newInstance();
		 if ("name".contains(f.getName())) {
		 f.set(person, "李四");
		 }else if("age".contains(f.getName())) {
		 f.set(person, 14);
		 }
		 System.out.println(f.get(person));
		 }

方法:

	//实例化对象
		Class c = Class.forName("com.reflect.Person");
		Object o = c.newInstance();
		//无参无返回
		 Method m1= c.getMethod("m1", null);
		 //调用
		 m1.invoke(o, null);
		 
		 
		//无参有返回
		 Method m2= c.getMethod("m2", null);
		 System.out.println(m2.invoke(o, null));
		
		//有参无返回
		 Method m3=c.getMethod("m3", Integer.class,String.class);
		 m3.invoke(o, 2,"A");
		//有参有返回
		 Method m4=c.getMethod("m4", Integer.class,String.class);
		 System.out.println(m4.invoke(o, 2,"A"));

构造方法:

 Class c = Class.forName("com.reflect.Person");
		// 无参
		 Constructor cto= c.getConstructor(null);
		 System.out.println(cto);
		// 所有
		 Constructor[] ctos= c.getConstructors();
		 for (Constructor constructor : ctos) {
			 //获取构造犯法的名称
		 System.out.println(constructor.getName());
	}

下面是一个方法的图:







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值