在昨天的项目里面需要实现如下需求“将一个传过来的对象转成XML字符串,将XML字符串转为一个指定的对象”,必须用到反射进行高度定制,于是晚上结合网上的一些反射的博客,顺道复习一下反射的一些API基础,代码如下,后面备查:
作者 陈字文(热衷于PM\ORACLE\JAVA等,欢迎同行交流):ziwen#163.com 扣扣:4零9零2零1零零
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功能,一天天学习,这个也是一种进步。