Java反射示例
时间:2020-02-23 14:37:14 来源:igfitidea点击:
反射(这是Java中的一个特性)允许执行Java程序检查自身(或者其他代码)并操作程序的内部属性,例如获取成员的名称并对其执行某些操作,如删除或者显示成员。
默认情况下,Java中的每个对象都有getClass(),它基本上确定当前对象的类(即使在编译时未知)。
反射允许我们编写不必在编译时“识别”所有内容的程序,而是使程序具有动态性,因为它们可以在运行时链接在一起。
Java反射的一个简短示例
import java.lang.reflect.*; public class Main { public void print() { System.out.println("print"); } public static void main(String args[]) { try { Class c = Class.forName("java.lang.String"); Method m[] = c.getDeclaredMethods(); for (int i = 0; i < m.length; i++) System.out.println(m[i].toString()); } catch (Throwable e) { //manipulate e System.out.println(); } } }
在这里类forName给我们指定的类,然后调用getDeclaredMethods,目的是检索类中定义的方法列表。
方法m[]存储我们调用此方法的类的所有声明方法,在本例中为String。
这里需要Try-and-catch,如果我们没有,则会出现以下错误:
输出
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()
从输出中可以看到,String有很多方法。
建立Reflection
首先,必须获得一个类对象。最常见的方法是
Class class = Class.forName("java.lang.'class name, for example String'");
下一步是调用方法(例如getDeclaredMethods()、getFields()等)
下一步是使用反射API来操作/更改信息
另一个例子,遵循上述步骤
import java.lang.reflect.*; class Demo { private double exampleVariable; public Demo() { exampleVariable = 2.3; } public void method1() { System.out.println("The instance variable: " + exampleVariable); } public void method2(int n) { System.out.println("The number passed: " + n); } private void method3() { //private method System.out.println("Private method has been called"); } } class Main { public static void main(String args[]) throws Exception { Demo classToBeTested = new Demo(); //creating class object from the class using getClass() Class classObject = classToBeTested.getClass(); System.out.println("Name of class: " + classObject.getName()); //getting the constructor using getConstructor() Constructor constructor = classObject.getConstructor(); System.out.println("Name of constructor: " + constructor.getName()); //stores all the methods the class has Method[] methods = classObject.getMethods(); //printing all method names for (Method method : methods) System.out.println(method.getName()); } }
输出
Name of class: Demo Name of constructor: Demo method1 method2 wait wait wait equals toString hashCode getClass notify notifyAll