❶ java 中 invoke()的作用是什麼
在寫代碼的時候,發現從父類class通過getDeclaredMethod獲取的Method可以調用子類的對象,而子類改寫了這個方法,從子類class通過getDeclaredMethod也能獲取到Method,這時去調用父類的對象也會報錯。雖然這是很符合多態的現象,也符合java的動態綁定規范,但還是想弄懂java是如何實現的,就學習了下Method的源代碼。
Method的invoke方法:
1、先檢查AccessibleObject的override屬性是否為true。
AccessibleObject是Method,Field,Constructor的父類,override屬性默認為false,可調用setAccessible方法改變,如果設置為true,則表示可以忽略訪問許可權的限制,直接調用。
2、如果不是ture,則要進行訪問許可權檢測。用Reflection的quickCheckMemberAccess方法先檢查是不是public的,如果不是再用Reflection.getCallerClass方法獲得到調用這個方法的Class,然後做是否有許可權訪問的校驗,校驗之後緩存一次,以便下次如果還是這個類來調用就不用去做校驗了,直接用上次的結果。
3、調用MethodAccessor的invoke方法。每個Method對象包含一個root對象,root對象里持有一個MethodAccessor對象。我們獲得的Method獨享相當於一個root對象的鏡像,所有這類Method共享root里的MethodAccessor對象,(這個對象由ReflectionFactory方法生成,ReflectionFactory對象在Method類中是staticfinal的由native方法實例化。
❷ java invoke 以及 webservice詳解,求助
1、invoke()一般是java反射里的方法。
1、給外界提供的都是介面
定義一個介面,然後給這個介面定義一個實現類。
2、在src目錄下新建一個META-INF文件夾,在這個文件夾下新建一個xfire文件夾,在這個文件夾下再新建一個service.xml文件。
文件內容配置例子:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>CalculatorService</name><!--介面的名字-->
<serviceClass>com.hhaip.service.CalculatorService</serviceClass><!--定義的那個介面-->
<implementationClass>
com.hhaip.service.impl.CalculatorServiceImpl <!--介面的實現-->
</implementationClass>
</service>
</beans>
3、在web.xml中將服務公布出去
<!-- 將服務公布出去 -->
<servlet>
<servlet-name>XFireServlet</servlet-name>
<display-name>XFire Servlet</display-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
---------------------------------------------以上就是服務端信息-------------------------------------------------
---------------------------------------------以下就是客戶端信息-------------------------------------------------
1、客戶端使用Ant自動建站工具幫我生成好訪問Web介面所需要的信息。
2、Ant自動生成好客戶端代碼後,只需要新建一個測試類測試。
Ant配置例子:
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="WebService" basedir="." default="webservice">
<property file="build.properties" />
<path id="project-classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
</fileset>
</path>
<target name="webservice">
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask"
classpathref="project-classpath" />
<wsgen outputDirectory="${scr.dir}" wsdl="${wsdl.dir}" package="com.hhaip.client" overwrite="true"/>
</target>
</project>
build.properties
scr.dir=${basedir}/src
lib.dir=E:/jar/xfire-1.2.6/lib
wsdl.dir=http://localhost:8888/myxfire/services/CalculatorService?wsdl
--> wsdl.dir這個路徑配置最重要。
測試類代碼:
public class TestService {
public static void main(String[] args) {
CalculatorServiceClient client = new CalculatorServiceClient();
//CalculatorServiceClient是Ant生成的客戶端代碼
CalculatorServicePortType portType = client.getCalculatorServiceHttpPort();
//獲取介面
int addResult = portType.add(1, 3);
System.out.println(addResult);
}
❸ java invoke 反射的使用方法
你這個類是一個嚴格的JavaBean格式。。所以先可以獲得屬性。。然後獲得讀寫方法。。然後寫值。。讀值。。hibernate其實也就是採用的這種差不多的方式。。
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("TaskProvidePropsList");//這里的類名是全名。。有包的話要加上包名
Object obj = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
//寫數據
for(Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
Method wM = pd.getWriteMethod();//獲得寫方法
wM.invoke(obj, 2);//因為知道是int類型的屬性,所以傳個int過去就是了。。實際情況中需要判斷下他的參數類型
}
//讀數據
for(Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
Method rM = pd.getReadMethod();//獲得讀方法
Integer num = (Integer) rM.invoke(obj);//因為知道是int類型的屬性,所以轉換成integer就是了。。也可以不轉換直接列印
System.out.println(num);
}
}
}
❹ java反射機制 如何給不定參數invoke
invoke(Object obj,Object... args)
invoke方法本類就要兩個參數的啊 第一個參數是調用方法的專對象 第二個參數本來就是個屬可變參
直接在後面傳就可以了
BTW:可變參數在Java底層實現的時候就是個數組而已 實在不行你可以提供數組類型的參數來匹配可變參數
invoke(obj,new Object{參數1,參數2,參數3});
如果還不明白那麼qq找我吧:)