反射理解

反射
===
定义:
* 反射就是加载类,并解剖出类德各个组成部分
* 反射可以实现访问私有成员(private)
* 反射机制允许在运行时发现折使用类的信息

Class对象
===
每个类都会产生一个对应的Class对象,也就是保存在.class文件,所有类都是在对其第一个使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。

反射步骤:
===
* 加载:由类加载器完成,找到对应的字节码,创建一个Class对象
* 链接:验证类中的字节码,为静态域分配空间
* 初始化:如果该类有超类,则对其初始化,执行静态初始化器和静态初始化块

代码实例:(反射类的构造方法)
===

```
public class Demo2 {
    @Test
    public void test1() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
    {
        Class clazz = Class.forName("com.amrom.reflect.Person");
        Constructor c =  clazz.getConstructor(null);
        Person p = (Person) c.newInstance(null);
        System.out.println(p.name);
    }
    @Test
    public void test2() throws Exception {
        Class clazz =Class.forName("com.amrom.reflect.Person");
        Constructor c = clazz.getConstructor(String.class);
        Person p = (Person) c.newInstance("linjinbao");
        System.out.println(p.name);
    }
    @Test
    public void test3() throws Exception
    {
        Class clazz = Class.forName("com.amrom.reflect.Person");
        Constructor c =  clazz.getConstructor(String.class, int.class);
        Person p = (Person) c.newInstance("linjinbao", 19);
        System.out.println(p.name);
    }
    @Test
    public void test4() throws Exception {
        Class clazz = Class.forName("com.amrom.reflect.Person");
        Constructor c= clazz.getDeclaredConstructor(int.class);
        c.setAccessible(true);//暴力反射
        Person p =  (Person) c.newInstance(19);
        System.out.println(p.name);
    }
}

```
代码实例:(反射类的方法)
===
```
    public void test4() throws Exception {
        Class clazz = Class.forName("com.amrom.reflect.Person");
        Constructor c= clazz.getDeclaredConstructor(int.class);
        Method m = clazz.getMethod("setName", String.class);
        System.out.println(m);
        c.setAccessible(true);//暴力反射
        Person p =  (Person) c.newInstance(19);
        m.invoke(p, "zhizhang");//方法
        System.out.println(p.name);
    }
```
main()方法的反射:
===

```
public class Demo3 {
    @Test
    public void test() throws Exception {
        Class clazz = Class.forName("com.amrom.reflect.Person");
        Method m = clazz.getMethod("main", String[].class);
        m.invoke(null, new Object[]{new String[]{"a"}});
    }
}

```
```
public class Demo3 {
    @Test
    public void test() throws Exception {
        Class clazz = Class.forName("com.amrom.reflect.Person");
        Method m = clazz.getMethod("main", String[].class);
        m.invoke(null, (Object)new String[]{"a"});
    }
}

```
反射类的字段
===


```
public class Demo4 {
    @Test
    public void test() throws Exception {
        
        Person p = new Person();
        
        Class clazz = Class.forName("com.amrom.reflect.Person");
        Field f = clazz.getField("name");
        String name = (String) f.get(p);
        System.out.println(name);    
        System.out.println(f.getType());
        
    }
}
```

转载于:https://my.oschina.net/u/3693752/blog/1556885

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值