java反射獲取方法
❶ 如何用java反射取得一個對象里所有get方法的結果
public void method(TblFwlx obj) {
Class clazz = obj.getClass();
Field[] fields = obj.getClass().getDeclaredFields();//獲得屬性
for (Field field : fields) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(),
clazz);
Method getMethod = pd.getReadMethod();//獲得get方法
Object o = getMethod.invoke(obj);//執行get方法返回一個Object
}
}
❷ Java 怎麼通過反射獲取並實現這個類裡面的介面,並且實現介面中的方法
獲取當前線程的ClassLoader,通過ClassLoader獲取當前工作目錄,對目錄下的文件進行遍歷掃描。過濾出以.class為後綴的類文件,並載入類到list中,對list中所有類進行校驗,判斷是否為指定介面的實現類,並排除自身。返回所有符合條件的類。
這個方沒有考慮不同的文件格式。當程序打成jar包,發布運行時,上述的這種遍歷file的操作就失效了。只能掃描到當前方法的同級目錄及其子目錄。無法覆蓋整個模塊,遍歷文件的邏輯太啰嗦,可以簡化。
(2)java反射獲取方法擴展閱讀:
Java使用注意事項:
1、如果沒有定義環境變數classpath,java啟動jvm後,會在當前目錄下查找要運行的類文件。
2、如果指定了classpath,那麼會在指定的目錄下查找要運行的類文件。
3、PATH環境變數。作用是指定命令搜索路徑,在命令行下面執行命令如javac編譯java程序時,它會到PATH變數所指定的路徑中查找看是否能找到相應的命令程序。
4、需要把jdk安裝目錄下的bin目錄增加到現有的PATH變數中,bin目錄中包含經常要用到的可執行文件如javac/java/javadoc等待,設置好PATH變數後,就可以在任何目錄下執行javac/java等工具了。
❸ 在JAVA中,怎麼利用反射獲取一個方法
java的反射用法:(異常請自行處理)
①找到類:Class cl = Class.forName("java.util.Date");
②創建對象(要求這個類中含有空參數的構造方法):Object obj = cl.newInstence();
③根據名稱和參數找方法:Method method1 = cl.getMethod("getTime");//如果沒有參數不用寫第二個參數如果有參數的如:Method method2 = cl.getMethod("setTime",long.class);
④在某個對象上面執行方法,Object result = method1.invoke(obj);//如果有參數的Object result = method2.invoke(obj,21317362721);
執行的方如果有返回值,將返回值返回,否則返回null
❹ java 通過反射怎麼獲取方法中參數值
public <T> T invokeMethod(String beanName, String methodName,
Class<?>[] paramTypes, Object... parameters) {
try {
Object bean = ApplicationContextHolder.getBean(beanName);
Class<? extends Object> beanClass = bean.getClass();
// Method method = beanClass.getDeclaredMethod(methodName,
// paramTypes);
// Method m0 = ClassUtils.getPublicMethod(beanClass, beanName,
// paramTypes);
Method method = null;
Method[] ms = beanClass.getMethods();
for (Method m : ms) {
String mName = m.getName();
if (StringUtils.equals(methodName, mName)) {
boolean isThis = true;
Class<?>[] pt = m.getParameterTypes();
if (paramTypes.length == pt.length) {
int plength = paramTypes.length;
if (plength == 0) {
isThis = true;
} else {
for (int i = 0; i < plength; i++) {
boolean ff = pt[i]
.isAssignableFrom(paramTypes[i]);
if (!ff) {
isThis = false;
break;
}
}
}
} else {
isThis = false;
}
if (isThis) {
method = m;
break;
}
}
}
if (method == null) {
throw new NoSuchMethodException(beanName + "." + methodName);
}
Object obj = null;
if (parameters == null || parameters.length < 1) {
obj = method.invoke(bean);
} else {
obj = method.invoke(bean, parameters);
}
T out = (T) obj;
return out;
} catch (SecurityException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
} catch (IllegalArgumentException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
} catch (IllegalAccessException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
} catch (InvocationTargetException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
} catch (NoSuchMethodException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
}
return null;
}
上面是一個完整的通過bean的名稱和方法名稱來調用該bean下的一個方法的方法。應該對你有所幫助!
❺ 關於用java反射調用一個類裡面的方法並執行
Java中要用到反射,首先就必須要獲取到對應的class對象,在Java中有三種方法獲取類對應的class對象。
1、通過類的.class屬性
2、通過類實例的getClass()方法獲取
3、通過Class.forName(String className)方法獲取
現在比如在package下有個類Calculator
publicclassCalculator{
publicdoubleadd(doublescore1,doublescore2){
returnscore1+score2;
}
publicvoidprint(){
System.out.println("OK");
}
publicstaticdoublemul(doublescore1,doublescore2){
returnscore1*score2;
}
}
publicclassCalculatorTest{
publicstaticvoidmain(String[]args)throwsException{
//通過類的.class屬性獲取
Class<Calculator>clz=Calculator.class;
//或者通過類的完整路徑獲取,這個方法由於不能確定傳入的路徑是否正確,這個方法會拋ClassNotFoundException
// Class<Calculator>clz=Class.forName("test.Calculator");
//或者new一個實例,然後通過實例的getClass()方法獲取
// Calculators=newCalculator();
// Class<Calculator>clz=s.getClass();
//1.獲取類中帶有方法簽名的mul方法,getMethod第一個參數為方法名,第二個參數為mul的參數類型數組
Methodmethod=clz.getMethod("mul",newClass[]{double.class,double.class});
//invoke方法的第一個參數是被調用的對象,這里是靜態方法故為null,第二個參數為給將被調用的方法傳入的參數
Objectresult=method.invoke(null,newObject[]{2.0,2.5});
//如果方法mul是私有的private方法,按照上面的方法去調用則會產生異常NoSuchMethodException,這時必須改變其訪問屬性
//method.setAccessible(true);//私有的方法通過發射可以修改其訪問許可權
System.out.println(result);//結果為5.0
//2.獲取類中的非靜態方法
Methodmethod_2=clz.getMethod("add",newClass[]{double.class,double.class});
//這是實例方法必須在一個對象上執行
Objectresult_2=method_2.invoke(newCalculator(),newObject[]{2.0,2.5});
System.out.println(result_2);//4.5
//3.獲取沒有方法簽名的方法print
Methodmethod_3=clz.getMethod("print",newClass[]{});
Objectresult_3=method_3.invoke(newCalculator(),null);//result_3為null,該方法不返回結果
}
}
❻ Java反射機制獲取set()方法 並且為set()方法傳值
Class數組 如果沒參數就直接 傳個null的Class進去 invoke里第一個參數寫該方法屬於的object 第2個如果方法所需的形參數為 0,就寫0... api上的
❼ java中反射的三種方法是
第一種:通過forName()方法;
第二種:類.class;
第三種:對象.getClass()。
舉例如下:
package
test;
public class Demo{
public static void
main(){
Class<?> c1 = null;
Class<?> c2 =
null;
Class<?> c3 =
null;
//三種反射用實例化方式
try{
//最常用的一種形式
c1 =
Class.forName("test.X");
}catch(ClassNotFoundException
e){
e.printStackTrace();
}
//通過Object類中的方法實例化
c2
= new X().getClass();
//通過類.class實例化
c3 =
X.class;
System.out.println("類名:" + c1.getName());
//得到類名
System.out.println("類名:" + c2.getName());
//得到類名
System.out.println("類名:" + c3.getName());
//得到類名
}
}
❽ 如何通過java反射機制動態獲得方法名
public Object reflect(Class clazz, String methodName) {
Method[] methods = ClassName.class.getDeclaredMethods();
for(int i = 0; i < methods.length; i++) {
if(methods[i].getName().equals(methodName)) {
ret = methods[i].invoke(null, new Object[]{});
}
}
}