第一步:创建要反射的类的字节码文件对象,其实就是创建了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 + "]";
    }
    
    
}
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);
           
    }
}

  如果要反射普通方法

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:赋成的新值