标签: java-8

Java 8&Missing required capability需求能力:osgi.ee; 过滤器= "(&(osgi.ee = JavaSE的)(版本= 1.8))"

我使用Eclipse Luna win32.x86_64运行Java 8.

这里来自Help Menu > About > Installation Detail > Configuration Tab:

java.runtime.version=1.8.0_05-b13
java.version=1.8.0_05
Run Code Online (Sandbox Code Playgroud)

我创建了新的插件项目,请求JavaSE-1.8作为执行环境:

插件编辑器. JavaSE-1.8作为执行环境

myplugin/META-INF/MANIFEST.MF我的文件当然:

 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Run Code Online (Sandbox Code Playgroud)

我在产品文件中使用此插件.当我尝试验证它时,我收到以下错误:

验证对话框,从产品文件编辑器打开

当然,如果我开始使用该产品,我会得到:

!ENTRY org.eclipse.osgi 2 0 2014-07-10 08:14:22.042
!MESSAGE One or more bundles are not resolved because the following root constraints are not resolved:
!SUBENTRY 1 org.eclipse.osgi 2 0 2014-07-10 08:14:22.043
!MESSAGE Bundle update@********/myplugin/ was not resolved.
!SUBENTRY 2 myplugin 2 0 2014-07-10 08:14:22.044
!MESSAGE Missing required capability Require-Capability: osgi.ee; filter="(&(osgi.ee=JavaSE)(version=1.8))".
Run Code Online (Sandbox Code Playgroud)

我试过验证了很多:

首选项> Java>已安装的JRE …

eclipse osgi eclipse-plugin equinox java-8

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

如何诊断Java 8元空间泄漏?

我有一个带有一些有趣行为的J2EE应用程序......堆似乎表现良好,随着时间的推移随着垃圾收集而增长和缩小.没有明显的整体长期堆扩展.然而,在我们遇到MaxMetaspace并遇到OOME之前,元空间一直稳定地以每小时20 Mb的速度增长.我尝试了并行和G1垃圾收集器(jdk1.8.0_40).

应用程序在执行期间没有重新部署,因此它似乎不是典型的类加载器泄漏.有没有人建议如何追查这个泄漏的来源?

memory-leaks permgen classloader java-8 metaspace

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

Java8方法引用用作Function对象来组合函数

Java8中是否有一种方法可以使用方法引用作为Function对象来使用其方法,例如:

Stream.of("ciao", "hola", "hello")
    .map(String::length.andThen(n -> n * 2))
Run Code Online (Sandbox Code Playgroud)

这个问题与之无关Stream,它只是作为例子使用,我想对方法参考有答案

java lambda java-8 method-reference

34
推荐指数
5
解决办法
7511
查看次数

在Java Lambda中,为什么getClass()在捕获的变量上调用

如果你看一下字节码

Consumer<String> println = System.out::println;
Run Code Online (Sandbox Code Playgroud)

Java 8更新121生成的字节代码是

GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
DUP
INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
POP
INVOKEDYNAMIC accept(Ljava/io/PrintStream;)Ljava/util/function/Consumer; [
  // handle kind 0x6 : INVOKESTATIC
  java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
  // arguments:
  (Ljava/lang/Object;)V, 
  // handle kind 0x5 : INVOKEVIRTUAL
  java/io/PrintStream.println(Ljava/lang/String;)V, 
  (Ljava/lang/String;)V
]
ASTORE 1
Run Code Online (Sandbox Code Playgroud)

getClass()正在调用该方法System.out,结果被忽略.

这是间接空引用检查吗?

当然,如果你跑

PrintStream out = null;
Consumer<String> println = out::println;
Run Code Online (Sandbox Code Playgroud)

这会触发NullPointerException.

java lambda bytecode javac java-8

34
推荐指数
1
解决办法
964
查看次数

怎么做功能组合?

虽然不耐烦地等待Java 8发布,在阅读Brian Goetz的精彩"Lambda状态"文章之后,我注意到功能组合根本没有被覆盖.

根据上面的文章,在Java 8中应该可以:

// having classes Address and Person
public class Address {

    private String country;

    public String getCountry() {
        return country;
    }
}

public class Person {

    private Address address;

    public Address getAddress() {
        return address;
    }
}

// we should be able to reference their methods like
Function<Person, Address> personToAddress = Person::getAddress;
Function<Address, String> addressToCountry = Address::getCountry;
Run Code Online (Sandbox Code Playgroud)

现在,如果我想将这两个函数组合成一个函数映射Person到country,我怎样才能在Java 8中实现这一点?

java java-8

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

如何使用反射在Java 8中获取方法参数名称?

Java 8能够使用Reflection API获取方法参数名称.

  1. 如何获取这些方法参数名称?

  2. 据我所知,类文件不存储正式的参数名称.我如何使用反射获得这些?

java reflection method-parameters java-8

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

如何将字符串转换为lambda表达式?

我想了一下并提出了一个有趣的问题,假设我们有一个配置(输入)文件:

x -> x + 1
x -> x * 2
x -> x * x
x -> -x
Run Code Online (Sandbox Code Playgroud)

此外,我们有一个Integers 列表:

List<Integer> list = new ArrayList<>();
list.addAll(Arrays.toList(1, 2, 3, 4, 5));
Run Code Online (Sandbox Code Playgroud)

有没有办法将Strings(x -> x + 1等)转换为Object代表lambda表达式的s?然后可以用作:

Object lambda = getLambdaFromString("x -> x + 1");
if (lambda.getClass().equals(IntFunction.class) {
    list.stream().forEach()
        .mapToInt(x -> x)
        .map(x -> ((IntFunction)lambda).applyAsInt(x))
        .forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)

我怎么写这样的方法getLambdaFromString

  • 我可以从JDK/JRE中重用一些东西吗?
  • 我需要自己写这些吗?
  • 是否有可能缩小Object lambda到仅捕获lambda的其他东西?

java lambda java-8

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

Spring 4和Java 8无效的字节标记异常

我试图使用Spring和Java 8 JDK运行一个简单的JUnit测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
@WebAppConfiguration
public class UserServicesTest{

  @Test
  public void testJava8() {
    Set<String> strings = new HashSet<>();
    strings.add("a");
    strings.add("b");
    strings.add("c");
    strings.stream().filter(a -> a.equals("a")).forEach(p -> p.toString());
  }
Run Code Online (Sandbox Code Playgroud)

我在启动时遇到了这个运行时错误:

org.aspectj.apache.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 18
    at org.aspectj.apache.bcel.classfile.Constant.readConstant(Constant.java:133)
    at org.aspectj.apache.bcel.classfile.ConstantPool.<init>(ConstantPool.java:45)
    at org.aspectj.apache.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:186)
    at org.aspectj.apache.bcel.classfile.ClassParser.parse(ClassParser.java:131)
    at org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository.loadJavaClass(NonCachingClassLoaderRepository.java:262)
    at org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository.loadClass(NonCachingClassLoaderRepository.java:242)
    at org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository.loadClass(NonCachingClassLoaderRepository.java:249)
    at org.aspectj.weaver.reflect.Java15AnnotationFinder.getAnnotations(Java15AnnotationFinder.java:202)
    at org.aspectj.weaver.reflect.ReflectionBasedResolvedMemberImpl.unpackAnnotations(ReflectionBasedResolvedMemberImpl.java:211)
    at org.aspectj.weaver.reflect.ReflectionBasedResolvedMemberImpl.hasAnnotation(ReflectionBasedResolvedMemberImpl.java:163)
    at org.aspectj.weaver.patterns.ExactAnnotationTypePattern.matches(ExactAnnotationTypePattern.java:109)
    at org.aspectj.weaver.patterns.ExactAnnotationTypePattern.matches(ExactAnnotationTypePattern.java:96)
    at org.aspectj.weaver.patterns.AnnotationPointcut.matchInternal(AnnotationPointcut.java:156)
    at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:137)
    at org.aspectj.weaver.internal.tools.PointcutExpressionImpl.getShadowMatch(PointcutExpressionImpl.java:239)
    at org.aspectj.weaver.internal.tools.PointcutExpressionImpl.matchesExecution(PointcutExpressionImpl.java:105)
    at org.aspectj.weaver.internal.tools.PointcutExpressionImpl.matchesMethodExecution(PointcutExpressionImpl.java:96)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getShadowMatch(AspectJExpressionPointcut.java:404)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.matches(AspectJExpressionPointcut.java:271)
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:224)
    at …
Run Code Online (Sandbox Code Playgroud)

java spring java-ee java-8

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

在Java中,"1/0"是一个常量表达式吗?

据我所知,Java 8 JLS表达式(1/0)被认为是一个常量表达式,但是当我尝试使用OpenJDK 8编译以下程序时出现错误

public class Switch {
    public static void main(String[] args) {
        switch(42) {
            case (1/0):
                return;
            default:
                return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

错误说(1/0)不是一个常量表达式

Switch.java:4: error: constant expression required
            case (1/0):
                 ^
1 error
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?或者它是OpenJDK 8中的错误?

java openjdk compiler-errors jls java-8

33
推荐指数
2
解决办法
1412
查看次数

为什么我需要一个功能界面来处理lambdas?

我认为这个问题已经存在,但我无法找到它.

我不明白,为什么有必要使用功能界面来处理lambdas.请考虑以下示例:

public class Test {

    public static void main(String...args) {
        TestInterface i = () -> System.out.println("Hans");
//      i = (String a) -> System.out.println(a);

        i.hans();
//      i.hans("Hello");
    }
}

public interface TestInterface {
    public void hans();
//  public void hans(String a);
}
Run Code Online (Sandbox Code Playgroud)

这没有问题,但如果您取消注释注释行,它不会.为什么?在我的理解中,编译器应该能够区分这两种方法,因为它们具有不同的输入参数.为什么我需要一个功能界面并炸毁我的代码?

编辑:链接重复项没有回答我的问题,因为我问的是不同的方法参数.但是我在这里得到了一些非常有用的答案,感谢所有帮助过的人!:)

编辑2:对不起,我显然不是母语人士,但为了准确自己:

public interface TestInterface {
    public void hans();                 //has no input parameters</br>
    public void hans(String a);         //has 1 input parameter, type String</br>
    public void hans(String a, int b);  //has 2 input parameters, 1. type = String, …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 functional-interface

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