Java Reflection 反射机制_学习



JAVA反射机制( Reflection)

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

反射的主要作用:

运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理

本文以案例驱动的方式,记录一些反射常用的方法,此次记录,练练手,同时作为备忘记录,省的自己每次都得Google.


接口;IPersion

public interface IPersion {

	void run();

	void walk();

	void bus();

	void car();
}


测试类:Persion:

public class Persion implements IPersion {

	private String name;
	private int age;

	public Persion() {

	}

	public Persion(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public void sayHello() {
		System.out.println(name + "  " + age + " say hello!");
		return;
	}
                @Override
	public void bus() {
		// TODO Auto-generated method stub


	}


	@Override
	public void car() {
		// TODO Auto-generated method stub


	}


	@Override
	public void run() {
		// TODO Auto-generated method stub


	}


	@Override
	public void walk() {
		// TODO Auto-generated method stub


	}
//getter and setter
}



【案例1】通过一个对象获得完整的包名和类名

Persion persion = new Persion();
System.out.println(persion.getClass().getName());

结果:

com.xinchun.study.Persion

添加一句:所有类的对象其实都是Class的实例。 


【案例2】实例化Class类对象


Class<?> demo1 = null;
		Class<?> demo2 = null;
		Class<?> demo3 = null;
		// 方式一
		try {
			demo1 = Class.forName("com.xinchun.study.Persion");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		// 方式二
		demo2 = new Persion().getClass();
		// 方式三
		demo3 = Persion.class;
		
		System.out.println("demo1 类名称" + demo1.getName());
		System.out.println("demo2 类名称" + demo2.getName());
		System.out.println("demo3 类名称" + demo3.getName());

结果:

demo1 类名称com.xinchun.study.Persion

demo2 类名称com.xinchun.study.Persion
    demo3 类名称com.xinchun.study.Persion


【案例3】通过Class实例化其他类的对象

无参构造

	// 创建 Class 实例
		Class<?> demo = Persion.class;

		Persion p = null;
		try {
			p = (Persion) demo.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		p.setAge(24);
		p.setName("newspring");
		p.sayHello();

结果:

newspring  24 say hello!


带有参数的构造函数

	// 创建 Class 实例
		Class<?> demo = Persion.class;
// 取得全部的构造函数
		Constructor<?> cons[] = demo.getConstructors();
		// 构造函数的个数
		System.out.println(cons.length);
		try {
			Persion p1 = (Persion) cons[0].newInstance();
			Persion p2 = (Persion) cons[1].newInstance("newspring", 24);
		   
			
			p1.sayHello();
			p2.sayHello();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}

结果:

2

null  0 say hello!

newspring  24 say hello!


【案例4】返回一个类实现的接口

// 创建 Class 实例
		Class<?> demo = Persion.class;

		Persion p = null;
		 //所有的接口
        Class<?> intes[]=demo.getInterfaces();
        for (int i = 0; i < intes.length; i++) {
            System.out.println("实现的接口   "+intes[i].getName());
        }
        
结果:

实现的接口   com.xinchun.study.IPersion

【案例5】返回一个类继承的父类

//取得父类,有且仅有一个
        Class<?> temp=demo.getSuperclass();
结果:

java.lang.Object

【案例6】获全部的构造函数

Constructor<?>[] cons = demo.getConstructors();
		for (int i = 0; i < cons.length; i++) {
			System.out.println(cons[i]);
		}

【案例7】通过class取得一个类的全部框架

本类的成员变量

Field[] field = demo.getDeclaredFields();
		for (int i = 0; i < field.length; i++) {
			// 权限修饰符
			int mo = field[i].getModifiers();
			String priv = Modifier.toString(mo);
			// 属性类型
			Class<?> type = field[i].getType();
			System.out.println(priv + " " + type.getName() + " "
					+ field[i].getName() + ";");
		}
实现接口或者父类的

Field[] filed1 = demo.getFields();
        for (int j = 0; j < filed1.length; j++) {
            // 权限修饰符
            int mo = filed1[j].getModifiers();
            String priv = Modifier.toString(mo);
            // 属性类型
            Class<?> type = filed1[j].getType();
            System.out.println(priv + " " + type.getName() + " "
                    + filed1[j].getName() + ";");
        }



【案例8】通过Class调用类中的方法

// 创建 Class 实例
		Class<?> demo = Persion.class;

		
			Method method = demo.getMethod("sayHello");
			method.invoke(demo.newInstance());

                      method = demo.getMethod("sayHello", String.class, int.class);
			method.invoke(demo.newInstance(), "newspring", 24);
结果:

null  0 say hello!

newspring  24 say hello!



【案例9】通过Class调用setget方法

	// setter
			Object o = demo.newInstance();
			Method method = demo.getMethod("set" + "Name", String.class);
			method.invoke(o, "newspring");
			// getter
			method = demo.getMethod("get" + "Name");
			System.out.println(method.invoke(o));

结果:

newspring

【案例10】通过反射操作属性

Object o = demo.newInstance();

			Field field = demo.getDeclaredField("name");
			field.setAccessible(true);
			field.set(o, "xinchun");
			System.out.println(field.get(o));
结果:

xinchun

【案例11】通过Class实例化其他类的对象

【案例12】通过Class实例化其他类的对象

【案例13】通过Class实例化其他类的对象

【案例14】通过Class实例化其他类的对象





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值