泛型与反射

1、泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。参数化类型就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
1)泛型类定义及使用
//定义
class Point{// 此处可以随便写标识符号
private T x ;
private T y ;
public void setX(T x){//作为参数
this.x = x ;
}
public void setY(T y){
this.y = y ;
}
public T getX(){//作为返回值
return this.x ;
}
public T getY(){
return this.y ;
}
};
//IntegerPoint使用
Point p = new Point() ;
p.setX(new Integer(100)) ;
System.out.println(p.getX());

//FloatPoint使用
Point p = new Point() ;
p.setX(new Float(100.12f)) ;
System.out.println(p.getX());
2)关于泛型的使用实例
1,成功与否。对应属性success。
2,异常信息。对应属性ex。若是操作正常执行,则就不在意这个属性的值。
3,我们操作的最终目的对象。对应属性obj。
import lombok.Data;

@Data
public class MultiObject {

/**
 * 成功状态
 */
private boolean success;

/**
 * 异常
 */
private Exception ex;

/**
 * 数据
 */
private T obj;

public MultiObject() {
}
/**
 * 注意:当传入的泛型是Boolean时,就和第三个构造函数冲突了。
 */
public MultiObject(boolean success) {
	this.success = success;
}
	public MultiObject(Exception ex) {
	this.success = false;
	this.ex = ex;
}
	public MultiObject(T value) {
	this.success = true;
	this.obj = value;
}

}
/**
* 将Json字符串信息转换成对应的Java对象
* @param json json字符串对象
* @param c 对应的类型
*/
public static T parseJsonToObj(String json, Class c) {
try {
JSONObject jsonObject = JSONObject.parseObject(json);
return JSON.toJavaObject(jsonObject, c);
} catch (Exception e) {
LOG.error(e.getMessage());
}
return null;}

2、反射就是把java类中的各种成分映射成一个个的Java对象。例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
1)得到某个对象的属性public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass(); //得到该对象的Class

Field field = ownerClass.getField(fieldName);// 通过Class得到类声明的属性
Object property = field.get(owner); //通过对象得到该属性的实例

 return property;

}
2)得到某个类的静态属性
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className); //首先得到这个类的Class。
Field field = ownerClass.getField(fieldName); //和上面一样,通过Class得到类声明的属性 Object property = field.get(ownerClass); // 因为该属性是静态的,所以直接从类的Class里取
return property;
}
3)执行某对象的方法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}

 Method method = ownerClass.getMethod(methodName, argsClass);// 通过Method名和参数的Class数组得到要执行的Method。    

return method.invoke(owner, args);// 执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。
}
4)执行某个类的静态方法
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class ownerClass = Class.forName(className);

  Class[] argsClass = new Class[args.length];

 for (int i = 0, j = args.length; i < j; i++) {
      argsClass[i] = args[i].getClass();
  } 
Method method = ownerClass.getMethod(methodName, argsClass);

return method.invoke(null, args);

}
5)新建实例
public Object newInstance(String className, Object[] args) throws Exception {
Class newoneClass = Class.forName(className);
Class[] argsClass = new Class[args.length]; //得到参数的Class数组
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
} Constructor cons = newoneClass.getConstructor(argsClass); //得到构造子
return cons.newInstance(args); //新建实例
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值