Java基础 反射的基础应用和Class笔记

笔记:

/**直接 throws Exception,完美包含全部异常!
 * ---------------------------
 *   Class:
     *   首先创建一个类, 接着编译程序: javac(exe) file.java,生成.class文件,
     *   之后执行程序: java(exe) file ,将此.class文件加载到内存中,就是一个运行时类,存在缓存区;
     *   每一个运行时类只能加载一次!
 *   ------------------------
 *   反射:
 *      有了反射,可以通过反射创建一个类的对象,并调用其中的结构:
 *         //0.声明Person的class类
 *         //1.创建clazz对应的运行时类Person 类的对象//newInstance()表示新建一个对象
 *         // 2.通过反射调用运行时类的指定的属性
 *              2.1调用公用属性 getField()
 *              2.2调用任意属性 getField(),setAccessible(true)设置可更改,然后再set()具体值
 *        //3.通过反射调用运行时类的指定方法:invoke(p,...)
 *        ---------------------
 *
 */

测试代码:

import org.junit.Test;
import java.lang.reflect.*;
import java.lang.reflect.Method;

public class Test1 {
    @Test
    public void test3() throws Exception{
        Person p=new Person();
        Class clazz=p.getClass();   //通过运行时类的对象,调用其getClass()
        System.out.println(clazz);
    }

    //有了反射,可以通过反射创建一个类的对象,并调用其中的结构
    @Test
    public void test2() throws Exception {
        //0.声明Person的class类
        Class clazz = Person.class;
        //1.创建clazz对应的运行时类Person 类的对象
        Person p = (Person) clazz.newInstance();   //newInstance()表示新建一个对象
        System.out.println(p);    //Person{age=0, name='null'}
        // 2.通过反射调用运行时类的指定的属性
             //2.1调用公用属性 getField()
        Field f1 = clazz.getField("name");
        f1.set(p, "LiuDeHua");
        System.out.println(p);  //Person{age=0, name='LiuDeHua'}
             //2.2调用任意属性 getField(),setAccessible(true)设置可更改,然后再set()具体值
        Field f2 = clazz.getDeclaredField("age");
        f2.setAccessible(true);
        f2.set(p, 2000);
        System.out.println(p);    //Person{age=2000, name='LiuDeHua'}

        //3.通过反射调用运行时类的指定方法:invoke(p,...)
        Method m1=clazz.getMethod("show");
        m1.invoke(p); //空参数
        Method m2=clazz.getMethod("display",String.class);
        m2.invoke(p,"CHINA"); //有参数参数
    }
    @Test//在有反射以前,如何创建一个类的对象,并调用其中的方法/属性
    public void test1(){
        Person p=new Person();
        p.setAge(10);
        p.setName("TangWei");
        System.out.println(p);
        p.show();
        p.display("HK");
    }

}

class Person extends Creature<String> implements Comparable,MyInterface {
    private int age;
    public String name;

    public Person() {
    }
    public void show(){
        System.out.println(this.getClass().getName()+"我是一个人类!");
    }
    public void display(String s){
        System.out.print("我的国籍是:"+s);
    }
    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        return 0;
    }
}

输出结果:

Person{age=10, name='TangWei'}
任务222_反射.Person我是一个人类!
我的国籍是:HKPerson{age=0, name='null'}
Person{age=0, name='LiuDeHua'}
Person{age=2000, name='LiuDeHua'}
任务222_反射.Person我是一个人类!
我的国籍是:CHINAclass 任务222_反射.Person

猜你喜欢

转载自www.cnblogs.com/zhazhaacmer/p/9822401.html