zoukankan      html  css  js  c++  java
  • 吴裕雄--天生自然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 ;
        }
    };
  • 相关阅读:
    QuickTest Professional对web网站进行测试后没有生成脚本信息解决办法
    如何使用loadrunner进行web网站性能测试
    spring boot架构浅谈
    spring cloud架构
    crontab误删操作的恢复与防范
    linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <
    redis原理及使用
    PHP三种字符串界定符的区别(单引号,双引号,<<<)
    php代码加密|PHP源码加密——实现方法
    java一键搭建新项目(地址)
  • 原文地址:https://www.cnblogs.com/tszr/p/12416983.html
Copyright © 2011-2022 走看看