导航:首页 > 编程语言 > javainvoke

javainvoke

发布时间:2023-06-02 19:30:36

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找我吧:)

阅读全文

与javainvoke相关的资料

热点内容
彩视制作教程 浏览:766
圣墟在哪个App看免费 浏览:395
网络哪些不能玩 浏览:868
probe315使用教程 浏览:646
数字电位器程序 浏览:198
c代码整理 浏览:104
网络营销具有什么优势 浏览:378
右下角网络连接不显示宽带连接 浏览:940
ps修改tif文件 浏览:580
预防医学如何转行做大数据 浏览:234
pdf文件变蓝 浏览:309
怎么在pdf文件上面用k宝签名 浏览:213
如何知道表格里数据后面有空格 浏览:720
gee引擎更新系统找不到指定文件 浏览:802
贝壳网的数据删除了如何找回 浏览:509
华为荣耀6x怎么切换网络 浏览:418
手机里的pdf文件在哪放 浏览:889
java版贪吃蛇毕业论文 浏览:989
微信公共号邮箱 浏览:415
图片宽度代码 浏览:460

友情链接