反射?看一篇文章你就会了( 四 )


不写,null,或 new Object[]{}
若底层方法返回的是数组类型,invoke方法返回的不是底层方法的值,而是底层方法的返回类型;
import java.lang.reflect.Method;
class Dept{ public String show(String name){//用反射的方法来调用正常的方法 return name+",您好!"; } private void privateshow(){//用反射来实现对私有化方法的调用 System.out.println("privateshow"); } public static void staticshow(){ System.out.println("staticshow"); }}public class InvokeDemo9 { public static void main(String[] args) throws Exception { /* 传统方式:String name = new Dept().show("刘昭"); System.out.println(name);*//** * Method getMethod(String name, Class<?>... parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指 定公共成员方法 。name - 方法名 parameterTypes - 参数列表 */ //想要通过反射来调用Dept中的方法 Class<Dept> c = Dept.class; Method m = c.getMethod("show", String.class); Object o = m.invoke(c.newInstance(), "刘昭"); System.out.println(o);//私有化的方法 m = c.getDeclaredMethod("privateshow");//无参方法 m.setAccessible(true); o = m.invoke(c.newInstance());//静态方法的调用 m = c.getMethod("staticshow"); m.invoke(null);//staticshow为静态方法,不需创建对象,所以这里会是null }}打印
刘昭,您好!
privateshow
staticshow
使用反射操作字段Field提供两组方法操作字段:
xxx getXxx(Object obj):获取obj对象该Field的字段值,此处的xxx表示8个基本数据类型 。若该字段的类型是引用数据类型则使用,Object get(Object obj);
void setXxx(Object obj,xxx val):将obj对象的该Field字段设置成val值,此处的xxx表示8个基本数据类型 。若该字段的类型是引用数据类型则使用,void set(Object obj, Object value);
package junereflect624;
//获取字符,并且赋值,然后再取出来(对应的去查看api,比如这个是Field,别的比如Constructor,Method)
步骤:
获取类
获取字段
赋值(set(c.newInstance(),””));{如果为私有的话设置可接受}
import java.lang.reflect.Field;
class Cat{ private String name; public int age; private String color;}public class FieldDemo12 { public static void main(String[] args) throws Exception { Class<Cat> clz = Cat.class; Field[] f = clz.getDeclaredFields();for (Field field : f) { System.out.println(field); }Field fi = clz.getDeclaredField("name"); System.out.println(fi);System.out.println(fi.getName());//name//核心开始 /** * void set(Object obj, Object value)将指定对象变量上此 Field 对象表示的字段设置为指定的新值 。*/ Cat c = clz.newInstance(); fi.setAccessible(true); fi.set(c, "刘昭");//赋值成功 Object o = fi.get(c); System.out.println(o);//取出成功fi = clz.getDeclaredField("age"); fi.setAccessible(true); fi.set(c, 21); int i = fi.getInt(c);//左边的接受类型已经写成了int,右边的返回类型就也必须是int System.out.println(i);//获取成功 }}打印
private java.lang.String junereflect624.Cat.name
public int junereflect624.Cat.age
private java.lang.String junereflect624.Cat.color
private java.lang.String junereflect624.Cat.name
name
刘昭
21
反射和泛型-反射来获取泛型信息通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public 。获得Field对象后都可以使用getType()来获取其类型 。
Class<?> type = f.getType();//获得字段的类型
但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>;
为了获得指定Field的泛型类型,我们采用:
Type gType = f.getGenericType();得到泛型类型
然后将Type对象强转为ParameterizedType,其表示增加泛型后的类型
Type getRawType()//返回被泛型限制的类型;
Type[] getActualTypeArguments()//返回泛型参数类型;
利用反射来获取泛型的类型(泛型信息)
步骤:
获取当前类
获取目标字段
获取包含泛型类型的类型 getGenericType()
强转至子类ParameterizedType 因为Type没有任何对应的方法
获得泛型真正的类型 getActualTypeArguments()
import java.lang.reflect.Field;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.HashMap;import java.util.Map;public class GetGenericTypeDemo14 { Map<String,Integer> map = new HashMap<String,Integer>();public static void main(String[] args) throws Exception { Class c = GetGenericTypeDemo14.class; Field f = c.getDeclaredField("map"); System.out.println(f); System.out.println(f.getName());//map// Class<?> getType() 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型 。Class cl = f.getType(); System.out.println("获得其类型:"+cl);//获得其类型:interface java.util.Map/** * Type getGenericType() 返回一个 Type 对象,它表示此 Field 对象所表示字段的声明类型 。* Type是Class的接口; */ Type t = f.getGenericType();//包含泛型的类型 System.out.println(t);//java.util.Map<java.lang.String, java.lang.Integer>/** * Type这个类里面没有任何的方法,所以需要调用子类的方法,那么大的类型转到小的类型,需要强转! */ ParameterizedType pt = (ParameterizedType)t;//强转到其子类 /** * Type[] getActualTypeArguments() 返回表示此类型实际类型参数的 Type对象的数组 。Type getOwnerType() 返回 Type 对象,表示此类型是其成员之一的类型 。Type getRawType() 返回 Type 对象,表示声明此类型的类或接口 。*/t = pt.getRawType();//类型的类或接口 System.out.println(t);Type[] ts = pt.getActualTypeArguments(); for (Type type : ts) { System.out.println(type); /** * class java.lang.String class java.lang.Integer */ } }}


推荐阅读