利用反射机制创建类的对象

第一步:创建要反射的类的字节码文件对象,其实就是创建了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:赋成的新值

努力到感动自己,坚持到无能为力
原文地址:https://www.cnblogs.com/Riven/p/4639058.html