java语言自省------反射

第一次去接触反射,感觉很陌生,接触一点后,只感觉很强大,自己只知道皮毛中的皮毛,只通过类名来获取类中的属性和方法,这是我接触反射的第一种方式,也是兴趣的出发点,想想这种技术是黑客技术的一种吧,就觉得虽然只是了解了一点点,但还是激起了我对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;
	}
}

只学了点皮毛,希望在今后的学习中可以接触到更多:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值