JAVA反射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA反射相关的知识,希望对你有一定的参考价值。

  java是面向对象的语言,在面向对象语言中,万事万物都是对象,但java中的基本数据类型和静态成员不是面向对象的,但基本数据类型有包装类型(int -->Integer),静态成员是属于类对象的。万事

万事万物都是对象,那么class类是谁的对象呢?

  类是对象,类是java.lang.Class类的实例对象。任何一个类都是Class类的实例对象。(理解)

什么是反射 ? 

  Oracle官网(翻译):反射它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。

反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。

举例:

技术分享
/选择排序 ,/
public class SelectionSort {
    private SelectionSort(){}

    public static   void sort(Comparable[] arr){
        int n = arr.length;
        for(int i = 0 ; i < n ; i++){
            int minIndex = i;
            for(int j = i+1; j < n ;j++){
                if(arr[minIndex].compareTo(arr[j]) >0){
                    minIndex = j;
                    swap(arr,i ,minIndex);
                }
            }
        }
    }

    public  static void swap(Object [] arr ,int i ,int j){
        Object temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
View Code
技术分享
public class TestSortHelper {
    private TestSortHelper() {
    }

    public static Integer[] generateArray(int n, int rangeL, int rangeR) {
        assert rangeL < rangeR;
        Integer[] arr = new Integer[n];
        for (int i = 0; i < n; i++) {
            arr[i] = new Integer((int) ((Math.random() * (rangeR - rangeL + 1)) + rangeL));
        }
        return arr;
    }

    public static boolean isSorted(Comparable[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i].compareTo(arr[i + 1]) > 0) {
                return false;
            }
        }
        return true;

    }

//这里用到了java的反射,注意sortClassName下面对讲到
    public static void testSort(String sortClassName, Comparable[] arr) {
        System.out.println("------------");
        try {
            Class sortClass = Class.forName(sortClassName);
            Method sortMethod = sortClass.getMethod("sort", new Class[]{Comparable[].class});
            Object[] params = new Object[]{arr};
            long startTime = System.currentTimeMillis();
            sortMethod.invoke(null, params);
            long endTime = System.currentTimeMillis();
            assert isSorted(arr);
            System.out.println(sortClass.getSimpleName() + ":" + (endTime - startTime) + "ms");

        } catch (Exception e) {
        }
    }
}
View Code
技术分享
/*这是程序的测试代码
 **
**  TestSortHelper.testSort("SelectionSort",a); ,这里我们把SelectionSort的类的全称传递过去(包名+类名)这里我没有包名,当下次我们有一个InsertSort(插入排序时),我们就只需要把插入排序的包名写入即可
    }
*/

 public static void main(String[] args) {
        int N = 20000;
        Integer[] a = TestSortHelper.generateArray(N ,0,10000);
       TestSortHelper.testSort("SelectionSort",a);
    }
View Code

反射的最体语法规则可以参考官网提供的API。这里就不细讲了,Field(属性对象),Method(方法对象)。以上提供的程序是可以允许的。

参考:http://www.sczyh30.com/posts/Java/java-reflection-1/

JAVA反射视频:http://www.imooc.com/learn/199

 

以上是关于JAVA反射的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

反射机制入门

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

OpenGL片段着色器不照亮场景