Java反射分析.md

来源:互联网 发布:建信优化基金530oo5 编辑:程序博客网 时间:2024/05/11 19:52

 反射的直观作用:

在Java程序运行时–

* 判断任意一个对象所属的类;
* 构造任意一个类的对象;
* 判断任意一个类的所有成员变量和方法;

通过Reflection APIs取得任意一直名称的class的内部信息—-看透class,在Java领域被称为内省.

 相关类(库)

在JDK中的Java.lang.reflect包中,存在以下相关类:

* CLass类:代表一个类
* Field类:代表类的成员变量(类的属性)
* Method类:代表类的方法
* Constructor类:代表类的构造方法
* Array类:提供动态创建数组,以及访问数组的元素的经台方法

 反射相关原则

* 无论某个类有多少对象,这些对象都对应着同一个Class对象

 代码示例

1.通过类名动态获取指定类信息.

比如,我们可以轻易地了解String类的所有方法(名).

public class ReflectTest {    public static void main(String[] args) throws ClassNotFoundException {        ReflectTest test = new ReflectTest();        test.getClassInfoByName("java.lang.String");    }    public void getClassInfoByName(String name) throws ClassNotFoundException {        Class<?> classType = Class.forName(name);        Method[] methods = classType.getDeclaredMethods();        System.out.println("类名是" + classType);        for (Method method : methods) {            System.out.println(method);        }    }}

输出:

    类名是class java.lang.String
    public boolean java.lang.String.equals(java.lang.Object)
    public java.lang.String java.lang.String.toString()
    public int java.lang.String.hashCode()
    public int java.lang.String.compareTo(java.lang.String)
    public int java.lang.String.compareTo(java.lang.Object)
    public int java.lang.String.indexOf(java.lang.String,int)
    public int java.lang.String.indexOf(java.lang.String)
    public int java.lang.String.indexOf(int,int)
    public int java.lang.String.indexOf(int)
    static int java.lang.String.indexOf(char[],int,int,char[],int,int,int)
    static int java.lang.String.indexOf(char[],int,int,java.lang.String,int)
    public static java.lang.String java.lang.String.valueOf(int)
    public static java.lang.String java.lang.String.valueOf(long)
    public static java.lang.String java.lang.String.valueOf(float)
    public static java.lang.String java.lang.String.valueOf(boolean)
    public static java.lang.String java.lang.String.valueOf(char[])
    public static java.lang.String java.lang.String.valueOf(char[],int,int)
    public static java.lang.String java.lang.String.valueOf(java.lang.Object)
    public static java.lang.String java.lang.String.valueOf(char)
    public static java.lang.String java.lang.String.valueOf(double)
    public char java.lang.String.charAt(int)
    private static void java.lang.String.checkBounds(byte[],int,int)
    public int java.lang.String.codePointAt(int)
    public int java.lang.String.codePointBefore(int)
    public int java.lang.String.codePointCount(int,int)
    public int java.lang.String.compareToIgnoreCase(java.lang.String)
    public java.lang.String java.lang.String.concat(java.lang.String)
    public boolean java.lang.String.contains(java.lang.CharSequence)
    public boolean java.lang.String.contentEquals(java.lang.CharSequence)
    public boolean java.lang.String.contentEquals(java.lang.StringBuffer)
    public static java.lang.String java.lang.String.copyValueOf(char[])
    public static java.lang.String java.lang.String.copyValueOf(char[],int,int)
    public boolean java.lang.String.endsWith(java.lang.String)
    public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
    public static java.lang.String java.lang.String.format(java.util.Locale,java.lang.String,java.lang.Object[])
    public static java.lang.String java.lang.String.format(java.lang.String,java.lang.Object[])
    public void java.lang.String.getBytes(int,int,byte[],int)
    public byte[] java.lang.String.getBytes(java.nio.charset.Charset)
    public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
    public byte[] java.lang.String.getBytes()
    public void java.lang.String.getChars(int,int,char[],int)
    void java.lang.String.getChars(char[],int)
    private int java.lang.String.indexOfSupplementary(int,int)
    public native java.lang.String java.lang.String.intern()
    public boolean java.lang.String.isEmpty()
    public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.CharSequence[])
    public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.Iterable)
    public int java.lang.String.lastIndexOf(int)
    public int java.lang.String.lastIndexOf(java.lang.String)
    static int java.lang.String.lastIndexOf(char[],int,int,java.lang.String,int)
    public int java.lang.String.lastIndexOf(java.lang.String,int)
    public int java.lang.String.lastIndexOf(int,int)
    static int java.lang.String.lastIndexOf(char[],int,int,char[],int,int,int)
    private int java.lang.String.lastIndexOfSupplementary(int,int)
    public int java.lang.String.length()
    public boolean java.lang.String.matches(java.lang.String)
    private boolean java.lang.String.nonSyncContentEquals(java.lang.AbstractStringBuilder)
    public int java.lang.String.offsetByCodePoints(int,int)
    public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)
    public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)
    public java.lang.String java.lang.String.replace(char,char)
    public java.lang.String java.lang.String.replace(java.lang.CharSequence,java.lang.CharSequence)
    public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
    public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
    public java.lang.String[] java.lang.String.split(java.lang.String)
    public java.lang.String[] java.lang.String.split(java.lang.String,int)
    public boolean java.lang.String.startsWith(java.lang.String,int)
    public boolean java.lang.String.startsWith(java.lang.String)
    public java.lang.CharSequence java.lang.String.subSequence(int,int)
    public java.lang.String java.lang.String.substring(int)
    public java.lang.String java.lang.String.substring(int,int)
    public char[] java.lang.String.toCharArray()
    public java.lang.String java.lang.String.toLowerCase(java.util.Locale)
    public java.lang.String java.lang.String.toLowerCase()
    public java.lang.String java.lang.String.toUpperCase()
    public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
    public java.lang.String java.lang.String.trim()

思路非常简单:
* (通过某种方式)获取Class对象
* 调用这个对象内部的方法,进行操作.

2.获取(并操作)某个类的方法

同样,第一步,获取Class对象,第二部获取方法.第三部调用方法.

Class<ReflectTest> clazz = ReflectTest.class;ReflectTest reflectTest = clazz.newInstance();Method method = clazz.getMethod("getClassInfoByName"new Class[]{String.class});Object result = method.invoke(reflectTest, new Object[]{"String"})

与此类似,反射Api中包括了很多可以直接”看透”类的方法,而反射的出现也大大降低了程序的耦合.

在之前,实例化一个类要用new关键字,但只要用到了new,就已经被耦合,被捆绑.而反射进一步抽象,让new离开的远远的,实现了更强的解耦.

但是由于反射性能并不优秀,所以一般在特定领域使用.

0 0