标签: java-7

MethodHandle - 这是什么一回事?

我正在研究JDK 1.7的新功能,我无法得到它为MethodHandle设计的内容?我理解(直接)静态方法的调用(以及在这种情况下直接使用Core Reflection API).我也理解(直接)调用虚方法(非静态,非最终)(以及使用需要通过Class层次结构的Core Reflection API obj.getClass().getSuperclass()).非虚方法的调用可以视为前者的特殊情况.

是的,我知道存在重载问题.如果要调用方法,则必须提供确切的签名.您无法以简单的方式检查重载方法.

但是,MethodHandle是什么?Reflection API允许您"查看"对象内部,而无需任何预先假设(如实现接口).您可以出于某种目的检查对象.但是MethodHandle的设计是什么呢?我应该何时何地使用它?

更新:我现在正在阅读这篇http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html文章.根据它,主要目标是简化在JVM上运行的脚本语言的生命,而不是Java语言本身.

更新-2:我读完了上面的链接,从那里引用了一些引文:

JVM将成为构建动态语言的最佳VM,因为它已经是一个动态语言VM.而InvokeDynamic通过向一流的JVM公民推广动态语言,将证明这一点.

使用反射来调用方法效果很好......除了一些问题.必须从特定类型检索方法对象,并且不能以一般方式创建.<...>

...反射调用比直接调用慢很多.多年来,JVM已经非常擅长快速反映调用.现代JVM实际上在幕后生成了一堆代码,以避免处理大量开销的旧JVM.但简单的事实是,通过任意数量的层反射访问总是比直接调用慢,部分原因是完全通用的"调用"方法必须检查并重新检查接收器类型,参数类型,可见性和其他细节,但因为参数必须都是对象(所以原语是对象框),并且必须作为一个数组提供,以涵盖所有可能的arities(所以参数得到数组框).

对于执行少量反射调用的库,性能差异可能无关紧要,特别是如果这些调用主要是为了在内存中动态设置静态结构,可以进行正常调用.但是在动态语言中,每次调用必须使用这些机制,这是一个严重的性能损失.

http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html

因此,对于Java程序员来说,它基本上是无用的.我对吗?从这个角度来看,它只能被视为Core Reflection API的替代方式.

java jvm invokedynamic java-7 methodhandle

47
推荐指数
4
解决办法
1万
查看次数

为什么我的URI没有分层?

我有资源文件夹中的文件.例如,如果我需要从资源文件夹中获取文件,我喜欢这样:

File myFile= new File(MyClass.class.getResource(/myFile.jpg).toURI());             
System.out.println(MyClass.class.getResource(/myFile.jpg).getPath());
Run Code Online (Sandbox Code Playgroud)

我已经测试过,一切正常!

路径是

/D:/java/projects/.../classes/X/Y/Z/myFile.jpg

但是,如果我创建jar文件,使用,Maven:

mvn package
Run Code Online (Sandbox Code Playgroud)

...然后启动我的应用程序:

java -jar MyJar.jar
Run Code Online (Sandbox Code Playgroud)

我有以下错误:

Exception in thread "Thread-4" java.lang.RuntimeException: ხელმოწერის განხორციელება შეუძლებელია
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
        at java.io.File.<init>(File.java:363)
Run Code Online (Sandbox Code Playgroud)

... 和文件的路径是:

file:/D:/java/projects/.../target/MyJar.jar!/X/Y/Z/myFile.jpg
Run Code Online (Sandbox Code Playgroud)

当我尝试从资源文件夹中获取文件时,会发生此异常.在这条线上.为什么?为什么JAR文件中存在这个问题?你怎么看?

有另一种方法,获取资源文件夹路径?

java jar executable-jar maven java-7

47
推荐指数
2
解决办法
8万
查看次数

Android Studio中的"tools.jar"文件不存在于classpath中

我下载了当前版本的Android Studio(截至2013年7月4日)我还下载了JDK版本7u25.

但是,它在启动后显示错误:请确保JAVA_HOME指向JDK而不是JRE.

我不知道如何解决这个问题,这不会让我运行IDE.我将不胜感激任何帮助.

ide classpath tools.jar java-7 android-studio

46
推荐指数
5
解决办法
8万
查看次数

有没有人将Lambda表达式向后移植到Java 7?

阅读Java 8从lambdas中产生的字节码类型,我想起了Java 5发布的时候.当时有Retroweaver其他工具用于转换用JDK 5编译的字节码以在JRE 1.4上运行.

还有人为Java 8 lambdas创建了这样一个后向移植工具吗?它将让Java开发人员今天开始在生产质量的Java 7 JRE上使用lambdas,而不必等待6到12个月的Java 8 GA版本.

以下是我对后向传递器应该相对容易实现的原因的分析:

Java 8 lambdas似乎没有使用Java 7不具备的任何JVM功能(例如invokedynamic),并且java.lang.invoke.LambdaMetafactory该类及其依赖项看起来像纯Java,因此应该可以在第三方库中实现它们.因此,使用JDK 8编译的字节码可以通过添加带有LambdaMetafactory副本的第三方库(在不同的包下)并通过转换字节码来使用该元数据来在JRE 7上运行.也许还会生成一些合成类和方法来绕过可访问性检查,这java.lang.invoke.MagicLambdaImpl似乎意味着.或者为所有lambdas生成匿名内部类,就像一些支持lambda的早期访问JDK一样.

java lambda backport java-7 java-8

45
推荐指数
1
解决办法
7090
查看次数

jar中的Java访问文件导致java.nio.file.FileSystemNotFoundException

在尝试使用我的java应用程序将jar文件中的某些文件复制到临时目录时,会抛出以下异常:

java.nio.file.FileSystemNotFoundException
    at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171)
    at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157)
    at java.nio.file.Paths.get(Unknown Source)
    at com.sora.util.walltoggle.pro.WebViewPresentation.setupTempFiles(WebViewPresentation.java:83)
   ....
Run Code Online (Sandbox Code Playgroud)

这是我的一小部分setupTempFiles(带行号):

81. URI uri = getClass().getResource("/webViewPresentation").toURI();
//prints: URI->jar:file:/C:/Users/Tom/Dropbox/WallTogglePro.jar!/webViewPresentation
82. System.out.println("URI->" + uri );
83. Path source = Paths.get(uri);
Run Code Online (Sandbox Code Playgroud)

webViewPresentation目录位于我的jar的根目录中:

在此输入图像描述

当我将我的应用程序打包为jar时,此问题才会退出,在Eclipse中进行调试没有问题.我怀疑这与这个bug有关,但我不确定如何纠正这个问题.

任何帮助赞赏

如果事项:

我在Java 8 build 1.8.0-b132上

Windows 7 Ult.64位

java nio java-7

45
推荐指数
3
解决办法
3万
查看次数

Android导入java.nio.file.Files; 无法解决

我正在尝试新的Gmail API,示例使用java.nio.file包中的类,ei FilesFileSystems.

这些类是在Java jdk 1.7中引入的,因为我在我的Android应用程序中运行jdk 1.7.0_65,我不知道为什么Android Studio找不到这些类.

进口是:

import java.nio.file.FileSystems;
import java.nio.file.Files;
Run Code Online (Sandbox Code Playgroud)

我的build.gradle文件当然告诉系统像这样使用v.1.7

android {
    compileSdkVersion 19
    buildToolsVersion '20'
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}
Run Code Online (Sandbox Code Playgroud)

我指向jdk的正确目录:

在此输入图像描述

jdk列在"外部库"部分中:

在此输入图像描述

如果我浏览Java文件,我甚至可以找到java.nio.file.Files和.FileSystems:

在此输入图像描述

现在,****正在发生什么!?根据我的理解,我在这里做的一切,有什么建议吗?

java android java-7

45
推荐指数
2
解决办法
2万
查看次数

升级到Java 7后,泛型类的类型参数化字段将变为不可见

现在,带有内置Java 7支持的Eclipse Indigo SR1终于推出了一两个星期,我正在将我的游乐场项目从Helios SR2 + JDK 1.6_23迁移到Indigo SR1 + JDK 1.7.0.完全重建所有项目后,只有一个类无法编译.它是以下类,它在Java 1.6(和1.5)上编译和运行完全正常:

public abstract class Area<A extends Area<?>> implements Comparable<Area<?>> {

    private String name;
    private Area<?> parent;
    private Set<A> areas;

    protected Area(String name, A... areas) {
        this.name = name;
        this.areas = new TreeSet<A>();
        for (A area : areas) {
            area.parent = this;
            this.areas.add(area);
        }
    }

    public Set<A> getAreas() {
        return areas;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

该行area.parent = this;失败,出现以下错误parent:

字段Area <capture#1-of?>.parent不可见

在第一次怀疑Eclipse编译器之后,我尝试使用 …

java generics visibility java-7

44
推荐指数
1
解决办法
2297
查看次数

使用Java 7新IO获取文件/目录大小

如何在java 7中使用新的NIO获取文件或目录的大小?

nio java-7

43
推荐指数
3
解决办法
2万
查看次数

Locks AutoCloseable?

Locks AutoCloseable?也就是说,而不是:

Lock someLock = new ReentrantLock();
someLock.lock();
try
{
    // ...
}
finally
{
    someLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)

我能说......么:

try (Lock someLock = new ReentrantLock())
{
    someLock.lock();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在Java 7中?

java resources resource-management locks java-7

42
推荐指数
4
解决办法
1万
查看次数

什么意思是"javax.net.ssl.SSLHandshakeException:服务器证书更改在重新协商期间受到限制"以及如何防止它?

我们使用Oracle jdk 1.7.0_71和Tomcat 7.0.55.不幸的是,我们在服务器之间的SSL连接期间开始出现以下异常:

javax.net.ssl.SSLHandshakeException: server certificate change is restrictedduring renegotiation
Run Code Online (Sandbox Code Playgroud)

这是什么意思?怎么预防呢?

Tomcat重启后异常消失.

完整堆栈:

Caused by: javax.net.ssl.SSLHandshakeException: server certificate change is restrictedduring renegotiation
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[?:1.7.0_71]
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884) ~[?:1.7.0_71]
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276) ~[?:1.7.0_71]
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:266) ~[?:1.7.0_71]
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1402) ~[?:1.7.0_71]
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:209) ~[?:1.7.0_71]
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:878) ~[?:1.7.0_71]
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:814) ~[?:1.7.0_71]
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016) ~[?:1.7.0_71]
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) ~[?:1.7.0_71]
        at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702) ~[?:1.7.0_71]
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122) ~[?:1.7.0_71]
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) ~[?:1.7.0_71]
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) ~[?:1.7.0_71]
        at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:506) ~[commons-httpclient-3.1.jar:?]
        at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114) ~[commons-httpclient-3.1.jar:?]
        at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096) ~[commons-httpclient-3.1.jar:?]
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398) ~[commons-httpclient-3.1.jar:?]
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) ~[commons-httpclient-3.1.jar:?] …
Run Code Online (Sandbox Code Playgroud)

ssl tomcat java-7

41
推荐指数
2
解决办法
5万
查看次数