`
freish
  • 浏览: 83956 次
  • 性别: Icon_minigender_1
  • 来自: 摄影帝国
社区版块
存档分类
最新评论

java bridge method

    博客分类:
  • java
 
阅读更多

java编译器采用bridge方法来兼容本该使用泛型的地方使用了非泛型的用法的问题。

 

如下代码:

 

public class TestBridgeMethod {
	public static void main(String[] args) {
		P p = new S();
		p.test(new Object());
	}
}

class P<T> {
	public T test (T t){
		return t;
	}
}

class S extends P<String> {
	@Override
	public String test(String t) {
		return t;
	}
}

 

p引用的是S的对象,但S的test方法返回值是String,在jdk1.4中没有泛型,就不会对p.test(new Object());进行检查,这样在调用的时候就会报ClassCastException

声明p的时候使用P<String> p就不会有这样的问题了。

 

 

为了兼容非泛型的代码,java编译器为test生成了两个方法。看下面的代码:

import java.lang.reflect.Method;
import java.util.Arrays;


public class TestBridgeMethod {
	public static void main(String[] args) {
		Class<?> clazz = S.class;
		Method[] methods = clazz.getMethods();
		for(Method method : methods) {
			System.out.println(method.getName() + ":" + Arrays.toString(method.getParameterTypes()) + method.isBridge());
		}
	}
}

class P<T> {
	public T test (T t){
		return t;
	}
}

class S extends P<String> {
	@Override
	public String test(String t) {
		return t;
	}
}
 

 

运行结果为:

 

test:[class java.lang.String]false

test:[class java.lang.Object]true

getClass:[]false

hashCode:[]false

equals:[class java.lang.Object]false

toString:[]false

notify:[]false

notifyAll:[]false

wait:[long, int]false

wait:[]false

wait:[long]false

 

编译器为S生成了两个test方法,一个参数为String,用于泛型。一个参数为Object,用于非泛型,这个方法就是bridge方法,调用method.isBridge返回true

分享到:
评论
2 楼 bo_hai 2016-12-16  
shuaiji 写道
你说女女么,我喜欢女女女

有病,得冶。
1 楼 shuaiji 2011-09-09  
你说女女么,我喜欢女女女

相关推荐

    javabridge-1.0.19-cp38-cp38-win_amd64.zip

    from javabridge import start_jvm, get_class, get_method, call_static_method start_jvm() # 启动 JVM StringClass = get_class("java/lang/String") # 获取 Java String 类 printlnMethod = get_method(String...

    javabridge-1.0.18-cp35-cp35m-win_amd64.zip

    from javabridge import get_env, start_vm, call_method start_vm(class_path=["path/to/your/classes"]) # 加载 Java 类 jb_object = get_env().find_class("com/example/YourJavaClass") # 创建 Java 对象 ...

    PHP-Java-Bridge

    2. **部署JavaBridge.jar**:将JavaBridge.jar放在服务器的适当位置,并确保Java守护进程可以访问。 3. **配置PHP**:将Java.inc添加到PHP的include_path中,以便PHP脚本可以轻松地引入和使用。 4. **启动Java守护...

    php调用java,不是http桥接

    如果需要后台运行,可使用`nohup java -jar JavaBridge.jar SERVLET_LOCAL:8080 &gt; JavaBridge.log &`,这样即使关闭终端窗口也能继续运行。 2. **配置PHP项目** - 将`Java.inc`文件放到PHP项目的指定目录(如`...

    JAVA调用C++的dell应用例子

    Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后两个都是sourceforge上的开源项目,同时也都是基于jni...

    tomcat+php调用jar包文件 JavaBridgeTemplate721.war php版本是7.2

    $url = 'http://your_server:port/JavaBridge/?java=com.example.MyClass&method=myMethod'; // 添加参数,如果有的话 $params = http_build_query(['param1' =&gt; 'value1', 'param2' =&gt; 'value2']); // 使用cURL发送...

    java调用vtk

    Java调用VTK不仅可以实现基本的3D渲染,还可以结合其他Java库,如ParaView Glance或 itk-jvtk-bridge,用于更复杂的可视化任务,如并行计算、大数据可视化和网络应用。 总的来说,Java调用VTK提供了一种在Java环境...

    java操作word文件工具类级dell文件

    在Java中,由于Java本身并不直接支持与Windows API交互,因此需要借助第三方库来实现,其中Jacob(Java COM Bridge)是一个常用的解决方案。 Jacob是一个开源Java库,它提供了Java到COM(Component Object Model)...

    Qt Android 调用JAVA

    bridge.callMethod("callFromQt", "(Ljava/lang/String;)V", QAndroidJniObject::fromString("Hello from Qt").object()); ``` 6. **运行和调试**:确保你的Qt应用和Android项目配置正确,然后在Android设备或...

    bridge-method-annotation-1.13.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    java操作word-jacob

    Jacob全称为Java COM Bridge,它是一个开源的Java库,允许Java应用程序利用COM(Component Object Model)接口来调用Windows上的COM组件,比如Microsoft Office套件中的Word。 在Java中,由于其原生不支持对Office...

    java设计模式(疯狂java联盟版)

    结构型模式如适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)和代理(Proxy),主要关注如何组合不同的类和对象以实现新的功能。行为型模式如策略...

    java给word文档插入水印并设置保护密码

    JACOB(JavaCOM Bridge)是一个Java到COM桥接库,它允许Java程序调用COM组件,如Microsoft Word。在Java项目中引入JACOB库,你可以通过以下步骤实现: 1. 下载JACOB的jar文件(通常为`jacob.jar`)及其对应的本地...

    scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetExcep

    2. **更新ADB(Android Debug Bridge)**:ADB是Android开发工具的一部分,用于连接设备和电脑进行调试。如果ADB版本过旧,可能会导致Scrcpy无法正常工作。更新至最新版本的ADB有时可以解决这类问题。 3. **USB调试...

    java 设计模式 demo

    7. 桥接模式(Bridge):将抽象部分与实现部分分离,使它们可以独立变化。Java中,桥接模式常用于将接口和其实现分离,提高扩展性。 8. 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构...

    java与模式光盘源码

    桥接模式(Bridge)将抽象部分与其实现部分分离,使它们可以独立变化,提供更大的灵活性。这些模式的组合使用可以帮助开发者构建更复杂、更健壮的系统。 在实际项目中,设计模式的应用可以提高代码的可读性、可维护...

    Java设计模式(疯狂Java联盟版) 

    2. **结构型模式**:结构型模式关注如何将类或对象组合成更大的结构,如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享...

    java设计模式和30种java架构图.zip

    2. 结构型模式:包括适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)、代理(Proxy),这些模式处理对象的组合和关系。 3. 行为型模式:如责任链...

    java父子资料(答案)

    - **JDBC-ODBC 桥驱动** (`JDBC-ODBC Bridge`): 通过 ODBC 接口与数据库通信。 - **本地库 Java 实现驱动** (`Native Library Implementation Driver`): 通过本地库与数据库通信。 - **网络协议驱动** (`Network ...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    16. **模板方法模式(Template Method Pattern)**:在抽象类中定义了一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 17. **状态模式(State...

Global site tag (gtag.js) - Google Analytics