Java之反射机制案例

 

一、什么是反射

  反射Java语言中的一种机制,通过这种机制可以动态的实例化对象,读写属性,调用方法,我们可以调用属性的私有方法了。

二、类类


        类类指的是,一个对象的实体类的类,通俗一点理解:类类是所有类的最大级

        获得类类的三种方法:

        ①、Class.forName(完整类名)
        ②、类名:.class
        ③、对象:.getClass()

 

三、反射的具体实现

下面是一个基本的类 Person

package com.zking.reflect;

public class Student {
	private String sid;

	private String sname;

	public Integer age;
	
	static{
		System.out.println("加载进jvm中!");
	}

	public Student() {
		super();
		System.out.println("调用无参构造方法创建了一个学生对象");
	}

	public Student(String sid) {
		super();
		this.sid = sid;
		System.out.println("调用带一个参数的构造方法创建了一个学生对象");
	}

	public Student(String sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
		System.out.println("调用带二个参数的构造方法创建了一个学生对象");
	}

	@SuppressWarnings("unused")
	private Student(Integer age) {
		System.out.println("调用Student类私有的构造方法创建一个学生对象");
		this.age = age;
	}

	public String getSid() {
		return sid;
	}

	public void setSid(String sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public void hello() {
		System.out.println("你好!我是" + this.sname);
	}

	public void hello(String name) {
		System.out.println(name + "你好!我是" + this.sname);
	}

	@SuppressWarnings("unused")
	private Integer add(Integer a, Integer b) {
		return new Integer(a.intValue() + b.intValue());
	}

	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", age=" + age + "]";
	}
}

 获取反射的方法三个

 代码如下

	//获取Class的三种方法
		Class<?> clzz01 = Class.forName("com.zking.reflect.Student");//Class.forName("全路径名")
		
		Class<?> clzz02=Student.class;//类名.class
		
		Student stu=new Student();
		Class<?> clzz03 = stu.getClass();
		
		System.out.println(clzz01);
		System.out.println(clzz02);
		System.out.println(clzz03);

 三、反射实例化


        三种方法:
                1、getConstructor        (获得构造器对象)
                2、getDeclaredConstructor     (获得构造器对象,私有化时)
                3、newInstance        (反射实例化)

        getConstructor方法只能用于获取公开构造函数
        newInstance获取一个实例

结果如下

 

	/*调用无参构造*/
		//方法:
		//getConstructor方法只能用于获取公开构造函数
		//newInstance获取一个实例
		Constructor<?> c1 = clzz01.getConstructor();
		Student stu01 =(Student)c1.newInstance();
		System.out.println(stu01);
		System.out.println("-------------------------------");
		
		
		
		/*调用一个有参构造*/
		Constructor<?> c2 = clzz01.getConstructor(String.class);
		Student stu02 =(Student) c2.newInstance("1");
		System.out.println(stu02);
		System.out.println("-------------------------------");
		
		
		
		/*调用一个多参数构造*/
		Constructor<?> c3 = clzz01.getConstructor(String.class,String.class);
		Student stu03 = (Student)c3.newInstance("2","zs");
		System.out.println(stu03);
		System.out.println("-------------------------------");
		
		
		
		/*用getDeclaredConstructor方法调用私有有参构造*/
		Constructor<?> ctt4 = clzz01.getDeclaredConstructor(Integer.class);
		ctt4.setAccessible(true);//强制反射
		Student stu04 = (Student)ctt4.newInstance(34);
		System.out.println(stu04);
		System.out.println("-------------------------------");
		
		
		
		/*用getMethod获取hello在用stu3对象调用hello无参构造里的中方法*/
		Method method1 = clzz01.getMethod("hello");		
		method1.invoke(stu03);
		
		
		/*用getMethod获取hello在用stu3对象调用hello有参构造里的中方法*/
		//通过反射hello方法
		Method method02 = clzz01.getMethod("hello", String.class);
		method02.invoke(stu03, "小亮");
		
		/*用getDeclaredMethod获取add在用stu3对象调用hello有参构造里的中方法*/
		Method method3 = clzz01.getDeclaredMethod("add", Integer.class,Integer.class);
		method3.setAccessible(true);
		Integer he = (Integer)method3.invoke(stu03, 3,4);
		System.out.println("3+4="+he);
	

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值