Thinking in java-28 Reflection 反射机制

1. Java反射机制是什么?

点击查看stackoverflow相关详细问答。
这里写图片描述
反射是用来描述一种能审查其自身代码并能审查其他代码的一种机制。

2. Reflection相关API

点击这里查看详细PDF介绍。
- java.lang.reflect package
- java.lang.Class
这里主要介绍java.lang.Class
i). Class 实例代表着运行时的类或接口。
ii).每当我们编译一个新的类时,一个Class对象被创建。
iii). 它被保存在以.class为后缀的文件里,和该类名字相同。
iv).运行时,当我们想要创建给定类的对象时,JVM首先检查是否这个类的Class被加载。
v). 如果该类没加载,则类加载器会在文件系统中寻找具有相同名字的类。

方法介绍:
a). this.getClass().getName()
b). static method of Class: Class.forName(String name)
c). getMOdifiers()
d). this.getClass().getDeclaredFields()
e). get(Object o)
f). getName()

package com.fqyuan.thinking;

public final class Sample {
    private String fName;

    public Sample(String fName) {
        super();
        this.fName = fName;
    }

    public String toString() {
        StringBuffer result = new StringBuffer();
        String newLine = System.getProperty("line.separator");
        result.append(this.getClass().getName());
        result.append(" Object {");
        result.append(newLine);
        java.lang.reflect.Field[] fields = this.getClass().getDeclaredFields();
        for (int fieldId = 0; fieldId < fields.length; ++fieldId) {
            result.append(" ");
            try {
                result.append(fields[fieldId].getName());
                result.append(": ");
                // get the String name
                // get the value of the field in the “this” object 33
                result.append(fields[fieldId].get(this));
            } catch (IllegalAccessException ex) {
                System.out.println(ex);
            }
            result.append(newLine);
        }
        result.append("}");
        return result.toString();
    }

    public static void main(String[] arguments) {
        Sample sample = new Sample("Reflection");
        System.out.println(sample);
    }
}
//Running result:
com.fqyuan.thinking.Sample Object {
 fName: Reflection
}

3. Java反射机制Demo

package com.fqyuan.thinking;

import java.lang.reflect.Method;

class Reflected {
    private String name;
    private int id;

    public Reflected(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public void foo() {
        System.out.println("In Class Reflected.");
    }

    public void bar(int i) {
        id += i;
        System.out.println("id is: " + id);
    }

    public String toString() {
        return name + " " + id;
    }
}

public class TestReflection {
    public static void main(String[] args) throws Exception {
        Reflected rObj = new Reflected("Reflected class", 1);
        Method method = rObj.getClass().getMethod("foo", null);
        //New an instance of a class
        rObj.getClass().newInstance();
        method.invoke(rObj, null);

        Method method1 = rObj.getClass().getMethod("bar", int.class);
        method1.invoke(rObj, 5);

    }
}

//Running result:
In Class Reflected.
id is: 6

4.总结

  • 一般可以通过反射机制得到运行时类名,并创建该类实例。
  • 不赞成使用该方法,除非不得已而为之。因为这和java静态语言特性相悖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值