Java获取Class实例的四种方式、通过反射调用类的构造器,属性和方法

Class实例对应着一个运行时类(加载到内存中的类)。可以作为Class实例的对象:
1,class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类;
2,接口;
3,数组;
4,枚举类
5,注解;
6,基本数据类型;
7,void

获取运行时类的属性结构和内部结构
getField():获取运行时类及其父类中声明为public的属性
getDeclaredField():获取当前运行时类中所有的属性(不包括父类)
其他结构类似。

package reflection;

import org.junit.Test;

import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

public class Class4ways {

    @Test
    public void getProperties() throws Exception {
        Properties pro = new Properties();
        FileInputStream fis = new FileInputStream("src//pro.properties");
        pro.load(fis);
        System.out.println(pro.getProperty("user"));
        System.out.println(pro.getProperty("age"));

        ClassLoader loader = Class4ways.class.getClassLoader();
        InputStream is = loader.getResourceAsStream("pro.properties");
        Properties pro2 = new Properties();
        pro2.load(is);
        System.out.println(pro2.getProperty("user"));
        System.out.println(pro2.getProperty("age"));
    }
    //四种方法是同一个实例
    public static void main(String[] args) throws Exception {
        //方式一:调用运行时类的属性 .class
        Class<Person> c1 = Person.class;
        System.out.println("c1 = " + c1);

        //方式二:通过运行时类的对象
        Person p1 = new Person();
        Class<Person> c2 = (Class<Person>) p1.getClass();

        //方式三:调用Class的静态方法,最常用
        Class<Person> c3 = (Class<Person>) Class.forName("reflection.Person");
        System.out.println(c1==c3);

        //使用类的加载器
        ClassLoader loader = Class4ways.class.getClassLoader();
        Class<Person> c4 = (Class<Person>) loader.loadClass("reflection.Person");


        //通过反射创建类的对象
        Constructor<Person> constructor = c3.getConstructor(String.class, int.class);
        Person chrix = constructor.newInstance("Chrix", 18);
        System.out.println("chrix = " + chrix);

        //通过反射调用对象的属性和方法
        Field name = c3.getDeclaredField("name");
        name.set(chrix,"xiaoming");
        System.out.println("chrix = " + chrix);

        Method show = c3.getDeclaredMethod("show");
        show.invoke(chrix);

        //通过反射调用私有结构,构造器、属性、方法
        Field age = c3.getDeclaredField("age");
        age.setAccessible(true);
        age.set(chrix,20);
        System.out.println("chrix = " + chrix);

        Method display = c3.getDeclaredMethod("display", String.class);
        display.setAccessible(true);
        String str = (String)display.invoke(chrix,"Hello");
        System.out.println(str);
    }
}
class Person{
    public String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public void show(){
        System.out.println("I am a peroson.");
    }
    private String display(String str){
        System.out.println("str = " + str);
        return str;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值