欢迎使用CSDN-markdown编辑器

最近学习了Java的反射机制,也没有深入学习多少内容,这里只是简要介绍一下反射机制的基本使用方法。以后会结合具体的框架对Java的反射机制进一步的进行讲解。

1.反射的概念:反射就是把Java类中的各种成分映射成相应的Java类。

2.反射的用法
反射中有这样几种类来对应一个具体的类中的各种成分:

  • Class类,对应class类
  • Constructor类,对应类中的构造方法
  • Field类,对应类中的属性
  • Method类,对应类中的方法

Java的每一个类在内存中都有一个字节码,同一个类创建出的不同对象其实共用的是同一个字节码。
获得各个字节码对应的实例对象有三种方法:
- 类名.clas
- 对象.getClass(“类名”);
- Class.forName(“类名”);

为了演示反射机制的基本使用方法,我们先创建一个简单的Person类

public class Person
{
    private int age;
    private String name;
    public Person()
    {

    }
    public Person(int age,String name)
    {
        this.age=age;
        this.name=name;
    }
    public void getInfo()
    {
        System.out.println("Name:"+name+"  age:"+age);
    }
    public void sayHello(String param)
    {
        System.out.println("The parameter is:"+param);
    }
    public void sayHello2(String param1,String param2)
    {
        System.out.println("The parameters are:"+param1+","+param2);
    }
    public void sayHello3(String[] param)
    {
        for(String value:param)
        {
            System.out.println(value);
        }
    }
}

2.1Constructor类
获得Person类中的所有构造方法:

Constructor[] constructors=Class.forName("com.niit.Person").getConstructors();

获得Person类中的某一构造方法:

Constructor constructor=Class.forName("com.niit.yanfei.Person").getConstructor(int.class,String.class);

获得某一构造方法是通过传入不同的参数类型和参数个数来确定创建的是哪一个构造方法

2.2Field类获得Person中的属性

Person person=new Person(5,"zhansan");
Field fieldAge=person.getClass().getDeclaredField("age");
fieldAge.setAccessible(true);
System.out.println(fieldAge.get(person));

因为Person中的age属性和name属性都是私有的,所以在获取值的时候需要先设置一下:

fieldAge.setAccessible(true);

如果age属性为public,则可以直接获取:

Field fieldAge=person.getClass().getField("age");
System.out.println(fieldAge.get(person));

2.3Method类获得Person类中的方法
获取并调用无参方法:

Person person=new Person(5,"zhansan");
Method method=person.getClass().getMethod("getInfo", null);
method.invoke(person,null);

获取并调用有参方法(参数不为数组):

Person person=new Person(5,"zhansan");
Method method=person.getClass().getMethod("sayHello2", String.class,String.class);
method.invoke(person,"zhansan","lisi");

获取并调用有参方法(参数为数组)

Person person=new Person(5,"zhansan");
Method method=person.getClass().getMethod("sayHello3", String[].class);
method.invoke(person,(Object)new String[]{"zhansan","lisi"});
method.invoke(person, new Object[]{new String[]{"zhansan","lisi"}});

这里需要注意的是:
如果参数为数组,在调用方法的时候如果这样写:

method.invoke(person,new String[]{"zhansan","lisi"});

这样将会产生错误,这是为了兼容jdk1.4,会把数组传入的值拆开当成多个参数。而强制转换成Object类型或者创建一个Object类型,将会告诉编译器传入的是一个对象,不需要拆开当成多个参数使用。
另外有一点需要说明,如果method.invoke传入的第一个参数为null,则说明调用的是静态方法。

3.反射的作用:实现框架功能
之所以会运用反射机制,是因为在运行过程前并不知道要创建哪个对象,而是在运行的过程中根据配置文件动态创建需要的类。
这里稍微讲解一下如何加载配置文件:
方法一:
config.properties放在工程的根目录下

InputStream ips=new FileInputStream("config.properties");
Properties props=new Properties();
props.load(ips);
ips.close();

方法二:
config.properties和类放在同一个包下:

InputStream ips=Person.class.getClassLoader().getResourceAsStream("com/niit/config.properties");
Properties props=new Properties();
props.load(ips);
ips.close();

或者

InputStream ips=ReflectionTester.class.getResourceAsStream("config.properties");
Properties props=new Properties();
props.load(ips);
ips.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值