Class Person
{
private int x;
public int getAge(){
return age;
}
public void setAge(int age);//当做javabean来看,我们说设置age属性,而不是设置x属性。
{
this.x= age;
}
}
ReflectPoint pt1 = new ReflectPoint(3,5);
String propertyName = "x";要获取的javabean的属性的名字
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
Method methodGetX = pd.getReadMethod();
Object retVal = methodGetX.invoke(pt1);//get方法没有参数。不知道返回值类型,定义成Object
Method methodSetX = pd.getWriteMethod();
methodSetX.invoke(pt1,7);//set方法接收参数
pt1.getX();
private static void setProperty(Object pt1, String propertyName,
Object value) throws IntrospectionException,
IllegalAccessException, InvocationTargetException {
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass());
Method methodSetX = pd2.getWriteMethod();
methodSetX.invoke(pt1,value);
}
private static Object getProperty(Object pt1, String propertyName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
Method methodGetX = pd.getReadMethod();
Object retVal = methodGetX.invoke(pt1);
return retVal;
}
Map map = {name:"zxx",age,age:18};
BeanUtils.setProperty(map,"name","lhm");//把map集合的name属性的值改为"lhx";
PropertyUtils.setProperty(pt1,"x",9);//这里的9要写x属性的本来类型。不想进行类型转换就用这个
ArrayList collection = new ArrayList();
collection.add(1);
collection.add(1L);
collection.add("abc");
// int i = (Integer)collection.get(1);//这句会报错
//使用泛型的代码:
// 在集合中的应用
ArrayList collection1 = new ArrayList();
// collection1.add(1);
// collection1.add(1L);
collection1.add("String");
String i = collection1.get(0);// 在反射中的应用
//用反射实现操作:String str = new String(new StringBuffer("abc"));
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
String str1 = constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str1.charAt(2));
HashMap hm = new HashMap();
hm.put("zyq", 18);
hm.put("zsy", 49);
hm.put("zyx", 25);
Set> entrySet = hm.entrySet();
for(Map.Entry entry:entrySet){
System.out.println(entry.getKey() + ":" + entry.getValue());
}
import java.util.Set;
//dao data access object:CRUD
public class GenericDao {
//增
public void add(E x){
}
//删
public void delete(int id){
}
public void delete(E obj){
}
//查
public E findByID(int id){
return null;
}
public E findByName(String name){
return null;
}
public Set findByConditions(String where){
return null;
}
//改
public void update(E obj){
}
public static void update1(E obj){//静态方法不能用类上定义的泛型参数,但可以自己定义泛型,这里的E和类上的E是两码事。
}
}
(3)通过反射获得泛型的参数化类型
没办法通过泛型的引用,用反射 获取参数化类型的类型参数。 但可以通过反射获得方法的参数列表,从参数列表中获取参数化类型(ParameterizedType)的原始类型(RawType)和实际类型参数(ActualTypeArguments)
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.Vector;
class GenericTest {
public static void main(String[] args) throws Exception{
Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class);
Type[] types =applyMethod.getGenericParameterTypes();
ParameterizedType pType =(ParameterizedType) types[0];
System.out.println(pType.getClass());
System.out.println(pType.getOwnerType());
System.out.println(pType.getRawType());
System.out.println(pType.getActualTypeArguments()[0]);
}
public static void applyVector(Vector v){
}
/*
public static void applyVector(Vector v){ //这个方法和上边的方法是同一个方法。
}*/
}