第一次去接触反射,感觉很陌生,接触一点后,只感觉很强大,自己只知道皮毛中的皮毛,只通过类名来获取类中的属性和方法,这是我接触反射的第一种方式,也是兴趣的出发点,想想这种技术是黑客技术的一种吧,就觉得虽然只是了解了一点点,但还是激起了我对JAVA的极大兴趣 ;
下面是通过反射来从一个学生类名中取得它的属性和与属性相关的方法:
这个是学生类:
package com.yc.bean;
public class Student{
private String name;
private double high;
private Integer age;
public Student(){
System.out.println("enen");
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setHigh(double high){
this.high=high;
}
public double getHigh(){
return this.high;
}
public void setAge(Integer age){
this.age=age;
}
public Integer getAge(){
return this.age;
}
}
下面是用反射来获取当中的两个get/set方法并且实例化运用
运行Test类可得到在 主函数中赋值的两个数据:即在只知道类 名的时候调用了Student类的两个方法:
代码如下:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.ArrayList;
public class Test{
public static void main(String[] args) throws Exception{
Class c=Class.forName("com.yc.bean.Student");
System.out.println(c);
Object oselect * from mye01;select * from mye01;bj=c.newInstance();
System.out.println("新创建出来的对象"+obj);
//取出属性名
List<String> propertyNames=getFieldNames(c);
if(propertyNames==null||propertyNames.size()<=0){
return ;
}
for(String propertyName:propertyNames){
String setMethodName=getMethodName("set",propertyName);
Method toInvokedMethod=getInvokeMethod(setMethodName,c);
if(toInvokedMethod.getParameterTypes()[0].getName().equals("java.lang.Integer")||toInvokedMethod.getParameterTypes()[0].getName().equals("int")){
toInvokedMethod.invoke(obj,44);
}else if(toInvokedMethod.getParameterTypes()[0].getName().equals("java.lang.Double")||toInvokedMethod.getParameterTypes()[0].getName().equals("double")){
toInvokedMethod.invoke(obj,22.0);//激活方法
}else{
toInvokedMethod.invoke(obj,"mingjun");
}
//get方法
String getMethodName=getMethodName("get",propertyName);
toInvokedMethod=getInvokeMethod(getMethodName,c);
System.out.println(toInvokedMethod.invoke(obj));
}
}
//将方法名用stringbuffer类连接成方法名:
private static String getMethodName(String prefix,String propertyName){
String suffix=propertyName.substring(0,1).toUpperCase()+propertyName.substring(1);
return prefix+suffix;
}
//取出所有属性名
private static List<String> getFieldNames(Class c){
List<String> propertyNames=new ArrayList<String>();
Field[] fs=c.getDeclaredFields();
if(fs!=null&&fs.length>0){
for(Field f:fs){
propertyNames.add(f.getName());
}
}
return propertyNames;
}
//根据方法在Class对象中查找到方法对象 Method
private static Method getInvokeMethod(String methodName,Class c){
Method[] ms=c.getMethods();
if(ms!=null&&ms.length>0){
for(Method m:ms){
if(m.getName().equals(methodName)){
return m;
}
}
}
return null;
}
}
只学了点皮毛,希望在今后的学习中可以接触到更多: