吴裕雄--天生自然JAVA反射机制学习笔记:反射机制深入探究

package org.lxh.demo15.invokedemo ;
import java.lang.reflect.Array ;
public class ChangeArrayDemo{
    public static void main(String args[]) throws Exception{
        int temp[] = {1,2,3} ;// 声明一整型数组
        int newTemp[] = (int []) arrayInc(temp,5) ;    // 重新开辟空间5
        print(newTemp) ;
        System.out.println("
-------------------------") ;
        String t[] = {"lxh","mldn","mldnjava"} ;
        String nt[] = (String [])arrayInc(t,8) ;
        print(nt) ;
    }
    public static Object arrayInc(Object obj,int len){
        Class<?> c = obj.getClass() ;
        Class<?> arr = c.getComponentType() ;    // 得到数组的
        Object newO = Array.newInstance(arr,len) ;    // 开辟新的大小
        int co = Array.getLength(obj) ;
        System.arraycopy(obj,0,newO,0,co) ;    // 拷贝内容
        return newO ;
    }
    public static void print(Object obj){    // 数组输出
        Class<?> c = obj.getClass() ;
        if(!c.isArray()){    // 判断是否是数组
            return;
        }
        Class<?> arr = c.getComponentType() ;
        System.out.println(arr.getName()+"数组的长度是:" + Array.getLength(obj)) ;     // 输出数组信息
        for(int i=0;i<Array.getLength(obj);i++){
            System.out.print(Array.get(obj,i) + "、") ;    // 通过Array输出
        }
    }
};
package org.lxh.demo15.invokedemo ;
import java.lang.reflect.Array ;
public class ClassArrayDemo{
    public static void main(String args[]) throws Exception{
        int temp[] = {1,2,3} ;// 声明一整型数组
        Class<?> c = temp.getClass().getComponentType() ;    // 取得数组的Class对象
        System.out.println("类型:" + c.getName()) ;    // 取得数组类型名称
        System.out.println("长度:" + Array.getLength(temp)) ;
        System.out.println("第一个内容:" + Array.get(temp,0)) ;
        Array.set(temp,0,6) ;
        System.out.println("第一个内容:" + Array.get(temp,0)) ;
    }
};
package org.lxh.demo15.invokedemo ;
import java.lang.reflect.Field ;
public class InvokeFieldDemo{
    public static void main(String args[]) throws Exception{
        Class<?> c1 = null ;
        Object obj = null ;
        c1 = Class.forName("org.lxh.demo15.Person") ;    // 实例化Class对象
        obj = c1.newInstance() ;
        Field nameField = null ;
        Field ageField = null ;
        nameField = c1.getDeclaredField("name") ;    // 取得name属性
        ageField = c1.getDeclaredField("age") ;    // 取得name属性
        nameField.setAccessible(true) ;    // 此属性对外部可见
        ageField.setAccessible(true) ;    // 此属性对外部可见
        nameField.set(obj,"李兴华") ;    // 设置name属性内容
        ageField.set(obj,30) ;            // 设置age属性内容
        System.out.println("姓名:" + nameField.get(obj)) ;
        System.out.println("年龄:" + ageField.get(obj)) ;
    }
};
package org.lxh.demo15.invokedemo ;
import java.lang.reflect.Method ;
public class InvokeSayChinaDemo{
    public static void main(String args[]){
        Class<?> c1 = null ;
        try{
            c1 = Class.forName("org.lxh.demo15.Person") ;    // 实例化Class对象
        }catch(Exception e){}
        try{
            Method  met = c1.getMethod("sayChina") ;    // 找到sayChina()方法
            met.invoke(c1.newInstance()) ;    // 调用方法
        }catch(Exception e){
            e.printStackTrace() ;
        }
    }
};
package org.lxh.demo15.invokedemo ;
import java.lang.reflect.Method ;
public class InvokeSayHelloDemo{
    public static void main(String args[]){
        Class<?> c1 = null ;
        try{
            c1 = Class.forName("org.lxh.demo15.Person") ;    // 实例化Class对象
        }catch(Exception e){}
        try{
            Method  met = c1.getMethod("sayHello",String.class,int.class) ;    // 找到sayChina()方法
            String rv = null ;
            rv = (String)met.invoke(c1.newInstance(),"李兴华",30) ;    // 调用方法
            System.out.println(rv) ;
        }catch(Exception e){
            e.printStackTrace() ;
        }
    }
};
package org.lxh.demo15.invokedemo ;
import java.lang.reflect.Method ;
public class InvokeSetGetDemo{
    public static void main(String args[]){
        Class<?> c1 = null ;
        Object obj = null ;
        try{
            c1 = Class.forName("org.lxh.demo15.Person") ;    // 实例化Class对象
        }catch(Exception e){}
        try{
            obj = c1.newInstance() ;
        }catch(Exception e){}
        setter(obj,"name","李兴华",String.class) ;    // 调用setter方法
        setter(obj,"age",30,int.class) ;    // 调用setter方法
        System.out.print("姓名:") ;
        getter(obj,"name") ;
        System.out.print("年龄:") ;
        getter(obj,"age");
    }
    /**
        Object obj:要操作的对象
        String att:要操作的属性
        Object value:要设置的属性内容
        Class<?> type:要设置的属性类型
    */
    public static void setter(Object obj,String att,Object value,Class<?> type){
        try{
            Method met = obj.getClass().getMethod("set"+initStr(att),type) ;    // 得到setter方法
            met.invoke(obj,value) ;    // 设置setter的内容
        }catch(Exception e){
            e.printStackTrace() ;
        }
    }
    public static void getter(Object obj,String att){
        try{
            Method met = obj.getClass().getMethod("get"+initStr(att)) ;    // 得到setter方法
            System.out.println(met.invoke(obj)) ;    // 调用getter取得内容
        }catch(Exception e){
            e.printStackTrace() ;
        }
    }
    public static String initStr(String old){    // 将单词的首字母大写
        String str = old.substring(0,1).toUpperCase() + old.substring(1) ;
        return str ;
    }
};
package org.lxh.demo15 ;
interface China{    // 定义China接口
    public static final String NATIONAL = "China" ;    // 定义全局常量
    public static final String AUTHOR = "李兴华" ;    // 定义全局常量
    public void sayChina() ;        // 无参的,没有返回值的方法
    public String sayHello(String name,int age) ;    // 定义有两个参数的方法,并返回内容
}
public class Person implements China{
    private String name ;
    private int age ;
    public Person(){    // 无参构造
    }
    public Person(String name){
        this.name = name ;    // 设置name属性
    }
    public Person(String name,int age){
        this(name) ;
        this.age = age ;
    }
    public void sayChina(){    // 覆写方法
        System.out.println("作者:" + AUTHOR + ",国籍:" + NATIONAL) ;
    }
    public String sayHello(String name,int age){
        return name + ",你好!我今年:" + age + "岁了!" ;
    }
    public void setName(String name){
        this.name = name ;
    }
    public void setAge(int age){
        this.age = age ;
    }
    public String getName(){
        return this.name ;
    }
    public int getAge(){
        return this.age ;
    }
};
原文地址:https://www.cnblogs.com/tszr/p/12416983.html