zoukankan      html  css  js  c++  java
  • 利用反射机制创建类的对象

    第一步:创建要反射的类的字节码文件对象,其实就是创建了Class类的对象(一共有三种方法)

    方式一:通过对对象获取字节码文件对象
    例如:Person p = new Person();
        Class c1 = p.getclass();  //Object类中的方法:public final Class<?> getClass()返回此 Object 的运行时类。
    方式二:任意数据类型都具备一个class静态属性.
        Class c2 = Person.class;
    方式三:调用Class类中的静态方法forName()方法
               Class c3 = class.forName("包名+类名");
    第二步:获取类中的属性和方法的对象,要谁反射谁的对象.
        例如:看看构造方法有哪些,挑一个来用用.看看Class类给我们提供了哪些方法?
        public Constructor<?>[] getConstructors()throws SecurityException
        返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
        就是获取该字节码文件对象的所有公共的构造方法
        public Constructor<T> getConstructor(Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException
        返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。parameterTypes 参数是 Class 对象的一个数组
        其实就是构造方法对象,通过该对象可以访问Constructor 类中的方法
    第三步:通过Constructor类中的newInstance()方法创建我们要反射的类的对象.
    package lianxi1;
    
    public class Yordles
    {
        public String name;
        public int age;
        public String sex;
        public Yordles()
        {
            super();
        }
        public Yordles(String name)
        {
            super();
            this.name = name;
        }
        public Yordles(String name, int age, String sex)
        {
            super();
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
        @Override
        public String toString()
        {
            return "Yordles [name=" + name + ", age=" + age + ", sex=" + sex + "]";
        }
        
        
    }
    View Code
    package lianxi1;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class Demo1
    {
        public static void main(String[] args) throws InstantiationException, IllegalAccessException, Exception
        {   //创建Yordles类的字节码文件对象
            Class<Yordles> yd = Yordles.class;
            //调用Class类的方法,获取Yordles类构造方法对象的数组
               Constructor[] constructors = yd.getConstructors();
               //遍历数组
               for (Constructor constructor : constructors)
            {   //看看Yordles类中都有哪些构造方法
                System.out.println(constructor);
                /* 打印结果为:publiclianxi1.Yordles(java.lang.String,int,java.lang.String)
                  public lianxi1.Yordles(java.lang.String)
                  public lianxi1.Yordles()                                  
                  */
                
            }   //parameterTypes表示成员变量的类型,这里获取一个参的构造方法对象
               Constructor<Yordles> c = yd.getConstructor(String.class); 
               //创建Yordles类对象,并赋值一个名字
               Yordles yordle = c.newInstance("迅捷斥候");
               //打印结果为:Yordles [name=迅捷斥候, age=0, sex=null]
               System.out.println(yordle);
               
        }
    }
    View Code

     如果要反射普通方法

     public Method[] getMethods() throws SecurityException 获取所有公共的方法,包括继承的方法
     public Method[] getDeclaredMethods() throws SecurityException 获取所有声明的方法
     public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
    throws NoSuchMethodException,SecurityException
    name:方法名称 parameterTypes:参数的类型

    Method:
    public Object invoke(Object obj, Object... args) 执行方法
    throws IllegalAccessException,
    IllegalArgumentException,
    InvocationTargetException
    obj:我要执行哪个对象的方法 args:方法的参数

    如果要反射成员属性

    public Field getField(String name) 获取某个公共属性
    throws NoSuchFieldException,
    SecurityException

    public Field getDeclaredField(String name) 获取某个声明属性
    throws NoSuchFieldException,
    SecurityException

    Field:字段类
    public void set(Object obj, Object value) 为指定对象的指定字段赋值
    throws IllegalArgumentException,
    IllegalAccessException

    obj:要赋值字段的对象 value:赋成的新值

    努力到感动自己,坚持到无能为力
  • 相关阅读:
    Android平台下基于XMPP的IM研究
    Android File数据存储
    Android 获取屏幕分辨率的方式
    Android TabHost 动态修改图标或者动态改变标题
    Android DatePickerDialog用法
    SharedPreference Demo
    progressdialog 去边框
    [LCT学习时的一些笔记]
    [ZJOI2007]最大半连通子图
    【Matrixtree Theorem学习笔记】
  • 原文地址:https://www.cnblogs.com/Riven/p/4639058.html
Copyright © 2011-2022 走看看