JAVA-反射学习(3)

来源:互联网 发布:js insertbefore 方法 编辑:程序博客网 时间:2024/06/05 15:27
import java.lang.reflect.*;class Stu{    private String name;    private int age;    public boolean flag =true;    public Stu(){}    public Stu(String name,int age){        this.setName(name);        this.setAge(age);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public void study(){        System.out.println("i can study");    }    private void speak(String languge,int x){        System.out.println("I can speak :"+languge+" "+x);    }    public String toString(){        return this.name+" : "+this.age;    }}public class ReflectThree {    public static void classForInstance() throws Exception{        //第一步:我们通过上面的三种方式可以得到类的信息;        @SuppressWarnings("unchecked")        Class<Stu> stuClass =       (Class<Stu>)Class.forName("GeneIterAdaptReflect.com.Stu");        //第二步:如果该类Stu有无参的构造器,那么就可以用类信息调用newInstance();来创建一个实例        //好处:降低了于类(子类)之间的耦合,比如Stu是一个接口或者超类,我们就可以利用多态直接与接口打交道,来调用子类的方法        Stu stu1 = stuClass.newInstance();        stu1.setName("丽丽");        System.out.println(stu1.getName());        //第三步:通过有参数的构造器实例对象;        @SuppressWarnings("unchecked")        Constructor<Stu>[] constructor = (Constructor<Stu>[])         stuClass.getConstructors();        Stu stu2 = constructor[1].newInstance("qian",36);        System.out.println(stu2.toString());    }    public static void methodInfo() throws Exception{        @SuppressWarnings("unchecked")        Class<Stu> stuClass = (Class<Stu>)         Class.forName("GeneIterAdaptReflect.com.Stu");        //第四步:获取类的全部方法 public void study();        Method[] methods  = stuClass.getDeclaredMethods();          for(Method m:methods){            StringBuilder s = new StringBuilder();            //返回修饰符:            int x = m.getModifiers();            String modifyString = Modifier.toString(x);            //返回值类型;            Class<?> returnType = m.getReturnType();            //Type returnType = m.getGenericReturnType();            //参数个数及类型:            Class<?>[] paraClass = m.getParameterTypes();            if(paraClass.length==0){                s.append("");            }            else{                for(int i=0;i<paraClass.length;i++){                    s.append(paraClass[i].getSimpleName()+" ");                }            }                   System.out.println(modifyString+"             "+returnType.getSimpleName()+" "+m.getName()            +"("+s+")");        }       }    public static void fieldInfo() throws Exception{        Class<Stu> stuClass = (Class<Stu>)         Class.forName("GeneIterAdaptReflect.com.Stu");        Field[] fields = stuClass.getDeclaredFields();        for(int i=0;i<fields.length;i++){            System.out.println(Modifier.toString(fields[i].            getModifiers())+" "+fields[i].getName());        }    }    public static void callSpeakMethod()throws Exception{        //第一步拿到对象        Class<Stu> stuClass = (Class<Stu>)  Class.forName        ("GeneIterAdaptReflect.com.Stu");        Constructor<Stu>[] constructor=        (Constructor<Stu>[]) stuClass.getConstructors();        Stu stu3 = constructor[1].newInstance("qian",26);        //第二步拿到方法        Class<?>[] paraClass =new Class[]        {String.class,int.class};        Method privateMethod =         stuClass.getDeclaredMethod("speak",paraClass);        //设置私有方法的可访问权        privateMethod.setAccessible(true);        //调用方法        privateMethod.invoke(stu3, "English  French",2);    }    /**     * @param obj: 对象     * @param fieldName :属性名称(字段名)     * @param paraType  : 参数类型     * @param value  :想赋予的值     * @throws Exception      */    public static void setter(Object obj,String fieldName,Class<?> paraType,Object value) throws Exception{        //set的方法的标准写法:setName,而传进来的fieldName是字段        名 比如 name;要转换成标准形式;        String firstChar =        fieldName.substring(0, 1).toUpperCase();        String methodName = firstChar+fieldName.substring(1);        obj.getClass().getDeclaredMethod        ("set"+methodName, paraType).invoke(obj, value);    }    /**     * @param obj :对象名     * @param fieldName  :要get的字段名     * @return Object :返回任意类型值     * @throws Exception     */    public static Object getter(Object obj,String fieldName) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{        String firstChar =        fieldName.substring(0, 1).toUpperCase();        String methodName = firstChar+fieldName.substring(1);        //return obj.getClass().getDeclaredMethod("get"+methodName,null).invoke(obj,null);        return obj.getClass().getDeclaredMethod("get"+methodName).invoke(obj);    }    public static void main(String[] args) throws Exception {        Class<Stu> stuClass = (Class<Stu>) Class.forName("GeneIterAdaptReflect.com.Stu");        Stu stuObj = stuClass.newInstance();        setter(stuObj,"name",String.class,"zhangsan");        String getString =(String)getter(stuObj,"name");        System.out.println(getString);    }}
0 0