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

