Java中的反射。本站提示廣大學習愛好者:(Java中的反射)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中的反射正文
Java反射指的是在運轉形態時,可以獲取類的屬性和辦法或許修正類運轉時行為的進程。
java.lang.Class類提供了很多辦法用於獲取元數據、反省和改動類運轉時的行為。
Java的反射次要觸及java.lang和java.lang.reflect包下的類。
反射使用場景舉例java.lang.Class次要提供了以下兩個功用:
有三種方式,如下:
forName()辦法示例
可用於靜態加載,當你知道類的全限定名時,可以運用該方式。留意原始數據類型不適用該辦法;
package tmp;
class Simple
{
}
public class Test
{
public static void main(String args[]) throws ClassNotFoundException
{
Class<?> c = Class.forName("tmp.Simple");
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
tmp.SimplegetClass()辦法示例:
從實例對象中獲取Class對象
package tmp;
class Simple
{
}
public class Test
{
void printName(Object obj)
{
}
public static void main(String args[])
{
Simple s = new Simple();
Class<? extends Object> c = s.getClass();
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
tmp.Simple.class語法示例
作用於類名上,也可使用於原始數據類型,如下所示:
package tmp;
public class Test
{
public static void main(String args[])
{
Class<Boolean> c = boolean.class;
System.out.println(c.getName());
Class<Test> c2 = Test.class;
System.out.println(c2.getName());
}
}
boolean以下辦法可用於判別Class對象對應的類型:
1) public boolean isInterface(): 能否對應接口 2) public boolean isArray(): 能否對應數組 3) public boolean isPrimitive(): 能否對應原始數據類型代碼示例:
package tmp;
class Simple
{
}
interface My
{
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
System.out.println(c.isInterface());
Class<?> c2 = Class.forName("tmp.My");
System.out.println(c2.isInterface());
}
catch (Exception e)
{
System.out.println(e);
}
}
}
false有兩種方式,如下:
所以,通常來講,第二種方式比第一種運用范圍更廣。
Class對象調用newInstance()辦法示例
package tmp;
class Simple
{
void message()
{
System.out.println("Hello Java");
}
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
Simple s = (Simple) c.newInstance();
s.message();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
Hello Java
Constructor對象調用newInstance()辦法示例
留意這裡可以依據傳入參數的類型來失掉指定的結構辦法,還可以改動結構辦法的訪問權限限制。
package tmp;
import java.lang.reflect.Constructor;
class Simple
{
private String msg;
void message()
{
System.out.println("Hello Java," + msg);
}
private Simple(String s){
this.msg = s;
}
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
Constructor<?> con = c.getDeclaredConstructor(String.class);
con.setAccessible(true);
Simple s = (Simple) con.newInstance("...");
s.message();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
Hello Java,...
經過反射調用公有辦法
經過反射,我們可以調用其它類的公有辦法,次要觸及java.lang.Class和java.lang.reflect.Method類;
其中次要是用到了Method類的setAccessible辦法和invoke辦法,前者修正訪問權限,後者調用辦法。
經過調用有參公有辦法示例:
package tmp;
import java.lang.reflect.Method;
class A
{
private void cube(int n)
{
System.out.println(n * n * n);
}
}
class Test
{
public static void main(String args[]) throws Exception
{
Class<A> c = A.class;
Object obj = c.newInstance();
Method m = c.getDeclaredMethod("cube", new Class[]{ int.class });
m.setAccessible(true);
m.invoke(obj, 4);
}
}
關於javap工具
運用javap命令可以反匯編java的字節碼文件,展現class文件中的字段屬性、結構辦法、普通辦法信息;
運用闡明:

javap java.lang.Object示例

javap -c Test示例:
寫個復雜的Test類,如下:
package tmp;
class Simple
{
}
public class Test
{
public static void main(String args[])
{
System.out.println("Hello");
}
}
輸出javap -c Test:

根本屬於翻譯,做了小局部修正
http://www.javatpoint.com/java-reflection