zoukankan      html  css  js  c++  java
  • 反射

    1.每个类被加载后,系统都会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类

    2.Java程序中获得Class对象通常有如下三种方式:

    1)使用Class的forName()

    2)调用某个类的class属性

    3)调用某个对象的getClass()

    3.一旦获取了某个类的Class对象之后,程序就可以调用Class对象的方法来获得该对象和该类的真实信息了

    4.加载过程:

    Cat.java---->编译---->Cat.class---->加载至JVM(classload())---->Class对象---->以Class对象为模板进行创建对象

    5.获取Class对象

    public class ReflectionDemo{
        public static void main(String [] args) throws Exception{
            //得到Class对象
            Class clazz=Class.forName("Cat");
            Class clazz2=Cat.class;
            Class clazz3=new Cat().getClass();
            //clazz,clazz2,clazz3都指向同一个对象
            if(clazz==clazz2 && clazz2==clazz3){
                System.out.println("same");
            }
        }
    }
    class Cat{
        private String name;
        public void show(){
            System.out.println("cat cry");
        }
    }

    6.利用反射创建对象

    使用默认构造函数实例化对象    
    public static void main(String [] args) throws Exception{
        //得到Class对象
        Class clazz=Class.forName("Cat");
        Cat cat=(Cat) clazz.newInstance();
        cat.show();
    }
    使用带参数的构造函数实例化对象,普通类型参数
    import
    java.lang.reflect.Constructor; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到Class对象 Class clazz=Class.forName("Cat"); Constructor c=clazz.getConstructor(String.class,int.class); Cat cat=(Cat) c.newInstance("lvjy",28); System.out.println(cat.getName()); cat.show(); } }
    传递数组类型的参数
    import
    java.lang.reflect.Constructor; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到public Cat(String [] food)构造函数 Class clazz=Class.forName("Cat"); Constructor c=clazz.getConstructor(String[].class); Cat cat=(Cat) c.newInstance((Object) new String[]{"fish","mouse"}); for(String f:cat.getFood()){ System.out.println(f); } } }
    import java.lang.reflect.Constructor;
    public class ReflectionDemo{
        public static void main(String [] args) throws Exception{
            //得到public Cat(String [] food)构造函数
            Class clazz=Class.forName("Cat");
            Constructor c=clazz.getConstructor(String[].class);
            Cat cat=(Cat) c.newInstance(new Object[]{new String[]{"fish","mouse"}});
            for(String f:cat.getFood()){
                System.out.println(f);
            }
        }
    }

    7.利用反射调用函数

    调用无参函数
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    public class ReflectionDemo{
        public static void main(String [] args) throws Exception{
            //得到public Cat(String [] food)构造函数
            Class clazz=Class.forName("Cat");
            Method m=clazz.getMethod("show");
            m.invoke(clazz.newInstance());
            
        }
    }
    调用有参函数
    import
    java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到public Cat(String [] food)构造函数 Class clazz=Class.forName("Cat"); Method m=clazz.getMethod("show",String.class); m.invoke(clazz.newInstance(),"lvjy"); } }
    调用私有函数
    import
    java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ Class clazz=Class.forName("Cat"); Method m=clazz.getDeclaredMethod("greeting"); m.setAccessible(true);//暴力访问 m.invoke(clazz.newInstance()); } }


    8.利用反射访问成员变量

    访问公有变量
    import
    java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Field; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ Class clazz=Class.forName("Cat"); Field f=clazz.getField("name"); //取得f的值 String name=(String)f.get(clazz.newInstance()); System.out.println(name); } }
    访问私有变量
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    import java.lang.reflect.Field;
    public class ReflectionDemo{
        public static void main(String [] args) throws Exception{
            Class clazz=Class.forName("Cat");
            Field f=clazz.getDeclaredField("age");
            f.setAccessible(true);
            Cat cat=(Cat) clazz.newInstance();
            f.set(cat,30);
            System.out.println(f.get(cat));
        }
    }
  • 相关阅读:
    Lua与C++的一些交互
    图片叠加文字
    VS智能提示消失的解决方法
    VS2008包加载失败的真正解决方法
    WINDOWS下操作注册表 REG_EXPAND_SZ与REG_SZ的区别
    lua支持中文变量名
    SCROLLVIEW设置初始滚动条位置
    WINDOWS XP 自动关机
    C#通过WMI操作远程机器
    [InstallShield]如何在不同的Script文件之间共享全局变量
  • 原文地址:https://www.cnblogs.com/lvjygogo/p/8546444.html
Copyright © 2011-2022 走看看