Java反射之 getMethod() 與invoke的使用
阿新 • • 發佈:2018-12-28
http://blog.csdn.net/lycorisradiata_1/article/details/48493255
反射概述
Reflection(反射)是Java被視為動態語言的關鍵,反射機制允許程式在執行期藉助於Reflection API取得任何類的內部資訊,並能直接操作任意物件的內部屬性及方法。
Java反射機制主要提供了以下功能:
- 在執行時構造任意一個類的物件
- 在執行時獲取任意一個類所具有的成員變數和方法
- 在執行時呼叫任意一個物件的方法(屬性)
- 生成動態代理
Class 是一個類; 一個描述類的類.
封裝了描述方法的 Method,
描述欄位的 Filed,
描述構造器的 Constructor 等屬性.
package com.java.my; import com.java.my.service.testService; /** * @author wanjiadong * @description * @date Create in 9:53 2018/1/31 */ public class test1 { public static void main(String[] args) throws Exception { //第一種newInstance例項一個物件,通常與forName()配合使用 testService t = (testService) Class.forName("com.java.my.service.testService").newInstance(); String str = t.checkName("ff"); //使用反射 Class<?> c = Thread.currentThread().getContextClassLoader().loadClass("com.java.my.service.testService"); Object cStr = c.getMethod("checkName",String.class).invoke(c.newInstance(),"ff"); System.out.println(cStr.toString()); } }
public static void main(String[] args) throws Exception { // Class clazz = Test1.class; // Test1 test1 = (Test1) clazz.newInstance(); // // Field[] fields = clazz.getDeclaredFields(); // Constructor[] constructors = clazz.getDeclaredConstructors(); // System.out.println(clazz.getClassLoader()); Class clazz = Thread.currentThread().getContextClassLoader().loadClass("com.pojo.Test1"); clazz = Class.forName("com.pojo.Test1"); Method method = clazz.getDeclaredMethod("saySomething",String.class, int.class); Object objecct = method.invoke(clazz.newInstance(), "nima", 4); System.out.println(objecct.toString()); Method method1 = clazz.getDeclaredMethod("saySomething1",String.class, int.class); method1.setAccessible(true); Object objecct1 = method1.invoke(clazz.newInstance(), "nima111", 5); System.out.println(objecct1.toString()); Field field = clazz.getDeclaredField("sex"); field.setAccessible(true); System.out.println(field.get(clazz.newInstance())); }