Java的Reflect反射基础API练习

在昨天的项目里面需要实现如下需求“将一个传过来的对象转成XML字符串,将XML字符串转为一个指定的对象”,必须用到反射进行高度定制,于是晚上结合网上的一些反射的博客,顺道复习一下反射的一些API基础,代码如下,后面备查:
package com.yinhai.reflect.mainMethod;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import com.yinhai.reflect.domo.Demo;
import com.yinhai.reflect.domo.DemoInterface;

public class ReflectTester {
	public static void main(String[] args)throws Exception {
		DemoInterface inter = new Demo();
		//获取当前对象的完整路径
		System.out.println("当前对象完整路径==>"+inter.getClass().getName());
		//获取当前对象的名字
		System.out.println("当前对象类名=>"+inter.getClass().getSimpleName());
		//实例化一个CLASS对象,method 1
		Demo demo1 = (Demo)Class.forName("com.yinhai.reflect.domo.Demo").newInstance();
		System.out.println("反射得到的Demo m1==>"+demo1.getClass().getName());
		//实例化一个CLASS对象,method2
		Class<?> demo2 = Demo.class;
		System.out.println("反射得到的Demo m2==>"+demo2.newInstance().getClass().getName());
		//实例化一个DEMO对象 这个里面注意,使用newInstance()的时候,对象应该有一个午餐构造,否则会报错
		Demo demoObj = (Demo)Class.forName("com.yinhai.reflect.domo.Demo").newInstance();
		demoObj.setAac001("123124124");
		System.out.println("实例化一个Demo对象中的aac001==>"+demoObj.getAac001());
		//通过CLASS对象获取该类中的构造函数
		Constructor<?>[] constructorArray = Class.forName("com.yinhai.reflect.domo.Demo").getConstructors();
		Demo demoByCons = (Demo)constructorArray[0].newInstance("123456789","987654321");
		System.out.println("通过构造器==>"+constructorArray[0]+"得到Demo,其属性aac001 ==>"+demoByCons.getAac001());
		//通过CLASS对象获取该类实现的接口
		Class<?>[] intfes = Demo.class.getInterfaces();
		StringBuffer intesSb = new StringBuffer();
		for (Class<?> intf:intfes) {
			intesSb.append(intf.getName()+";");
		}
		System.out.println("Demo类实现的接口如下==>"+intesSb.toString());
		//通过CLASS对象获取该类的父类
		Class<?> supClass = Demo.class.getSuperclass();
		System.out.println("Demo类继承的父类如下==>"+supClass.getName());
		//获取CLASS对象的构造方法
		Constructor<?>[] cons = Demo.class.getConstructors();
		StringBuffer consSB = new StringBuffer();
		for(Constructor<?> con:cons){
			consSB.append(con.toString()+";");
		}
		System.out.println("Demo类中的构造方法如下==>"+consSB.toString());
		//具体分析构造方法
		Constructor<?>[] consDetails = Demo.class.getConstructors();
		System.out.println("Demo构造方法详细解析如下:");
		for(Constructor<?> con:consDetails){
			System.out.println("  构造方法==>"+con);
			int modifNum = con.getModifiers();
			System.out.println("    修饰符=>"+Modifier.toString(modifNum));
			Class<?>[] parats=con.getParameterTypes();
			for(Class<?> parat:parats){
				System.out.println("      参数类型>"+parat.getName());
			}
		}
		//反射Demo类中的方法
		Method[] metds = Class.forName("com.yinhai.reflect.domo.Demo").getDeclaredMethods();
		System.out.println("Demo中的方法详细如下:");
		for (Method metd:metds) {
			System.out.println("  方法名称如下"+metd.getName());
			System.out.println("    修饰符==>"+Modifier.toString(metd.getModifiers()));
			Class<?>[] demoMethodParameters=metd.getParameterTypes();
			for (Class<?> demoMethodParameter:demoMethodParameters) {
				System.out.println("      参数=>"+demoMethodParameter.getName());
			}
		}
		//如果Demo类中有方法getAnswerString,执行这个方法
		Method invokeMetd = Class.forName("com.yinhai.reflect.domo.Demo")
			.getDeclaredMethod("getAnswerString",String.class);
		Class<?> returnType = invokeMetd.getReturnType();
		String result=(String)invokeMetd.invoke(Demo.class.newInstance(),"你好");
		System.out.println("调用getAnswerString方法的返回值==>"+returnType.getSimpleName()+" 结果=>"+result);
		//对数组的操作
		System.out.println("使用发射对数组的操作如下:");
        int[] temp={1,2,3,4,5};
        Class<?> demo=temp.getClass().getComponentType();
        System.out.println("  数组类型: "+demo.getName());
        System.out.println("  数组长度  "+Array.getLength(temp));
        System.out.println("  数组的第一个元素: "+Array.get(temp, 0));
        Array.set(temp, 0, 20);
        System.out.println("  修改之后数组第一个元素为: "+Array.get(temp, 0));
        //通过反射动态修改数组的大小
        int[] newDemo = (int[])Array.newInstance(demo,20);
        System.arraycopy(temp, 0, newDemo, 0,Array.getLength(temp));
        StringBuffer intArraySb = new StringBuffer();
        for(int i:newDemo){
        	intArraySb.append(i).append(";");
        }
        System.out.println("扩展之后的数组内容为:"+intArraySb.toString());
        //类加载器
        /**
         * 其实在java中有三种类类加载器。
         * 1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。
         * 2)Extension ClassLoader 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类
         * 3)AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。
         * */
        System.out.println(Demo.class.getClassLoader().getClass().getName());
	}
}



调用的DEMO类实现如下:
package com.yinhai.reflect.domo;

import java.util.Date;

public class Demo implements DemoInterface{
	public String aac001;
	private String aac002;
	private String aac006;
	private int yae097;
	protected int aae011;
	Date aae036;

	public String getAac001() {
		return aac001;
	}

	public void setAac001(String aac001) {
		this.aac001 = aac001;
	}

	public String getAac002() {
		return aac002;
	}

	public void setAac002(String aac002) {
		this.aac002 = aac002;
	}

	public String getAac006() {
		return aac006;
	}

	public void setAac006(String aac006) {
		this.aac006 = aac006;
	}

	public int getYae097() {
		return yae097;
	}

	public void setYae097(int yae097) {
		this.yae097 = yae097;
	}

	public int getAae011() {
		return aae011;
	}

	public void setAae011(int aae011) {
		this.aae011 = aae011;
	}

	public Date getAae036() {
		return aae036;
	}

	public void setAae036(Date aae036) {
		this.aae036 = aae036;
	}

	public Demo() {
		super();
	}

	public static String getAnswerString(String input) {
		return "Andy:" + input;
	}

	public Demo(String aac001, String aac002, String aac006, int yae097,
			int aae011, Date aae036) {
		super();
		this.aac001 = aac001;
		this.aac002 = aac002;
		this.aac006 = aac006;
		this.yae097 = yae097;
		this.aae011 = aae011;
		this.aae036 = aae036;
	}
	
	public Demo(String aac001, String aac002) {
		super();
		this.aac001 = aac001;
		this.aac002 = aac002;
	}

	public void sayItsName() {
		System.out.println(this.getAac001());
	}

}

作者 陈字文(热衷于PM\ORACLE\JAVA等,欢迎同行交流):ziwen#163.com 扣扣:4零9零2零1零零

通过系统梳理反射内容,对之前很多框架使用的配置文件等等很多东西恍然大悟,比如Srping中的<bean id="xxx"class="xxx"></bean>里面的各种配置,就是一种简单的反射应用,之前比较理论,而现在可以通过反射实现一些简单的Spring功能,一天天学习,这个也是一种进步。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值