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; } }
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) { } } }
/*这是程序的测试代码 ** ** 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); }
反射的最体语法规则可以参考官网提供的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)