Microsoft Roslyn - 编译器即服务是 .NET 堆栈的一个很好的补充;我在 Java 世界中寻找类似的东西。我相信 Scala 在编译器插件的形式上有类似的东西,但不确定它有多灵活。
我试图在 Java 世界中解决的问题是允许用户编写一些自定义语法,并在内部将其重新连接为不同的语法。
我想在多个操作系统上找到JDK路径.
我不确定是否有一种很好的方法可以做到这一点,因为我一直在尝试和失败.
对于Windows,它将是这样的 - C:\Program Files\Java\jdk1.7.0_07或者这样
C:\Program Files(x86)\Java\jdk1.7.0_07
对于Linux,它将是这样的 - /usr/java/jdk1.7.0_07
我希望这适用于安装的任何JDK版本,因此Java\jdk之后的数字无关紧要.
我会用的 System.setProperty("java.home", path);
基本上,我要做的是当我运行我的程序时,将java.home设置为当前机器上安装的JDK,但是获得JDK路径证明是非常困难的,任何解决方案?
我需要编写一个模拟 java.lang.Class 类实例的测试。这可以通过 PowerMock 实现吗?
我尝试执行以下操作:
PowerMock.createMock(Class.class);
Run Code Online (Sandbox Code Playgroud)
结果是:
java.lang.IllegalAccessError: java.lang.Class
at sun.reflect.GeneratedSerializationConstructorAccessor12.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40)
at org.powermock.reflect.internal.WhiteboxImpl.newInstance(WhiteboxImpl.java:223)
at org.powermock.reflect.Whitebox.newInstance(Whitebox.java:139)
at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2146)
at org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:89)
Run Code Online (Sandbox Code Playgroud)
根据 PowerMock 的文档,这应该是可能的,但我仍然收到此错误。
有人设法做到这一点吗?
编辑:为什么我需要这个?在测试的编码中有以下语句:
if (someObject.getClass().getName().equals(SOME_CLASS_NAME_THAT_I_DONT_HAVE_ACCESS_TO)) { ... do some stuff ... }
Run Code Online (Sandbox Code Playgroud)
我需要我的测试来达到“if”中的编码,我什至不能提供具有相应名称的类的模拟实例。
作为一种解决方法,我可以在测试中创建一个具有相同名称和包的类,但它很难看。
编辑2:
我也尝试了这个链接的建议
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.junit.Test;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Test1.class})
public class Test1 {
@Test
public void test() {
PowerMock.createMock(Class.class);
}
}
Run Code Online (Sandbox Code Playgroud)
结果是一样的:“java.lang.IllegalAccessError: java.lang.Class”
所以作为最终结果 - 似乎没有办法创建 java.lang.Class 的模拟实例
谢谢
在Python中,您可以使用它exec()来执行一段代码。
有没有什么方法可以在 Java 中执行此操作,以便我可以从字符串调用函数,而且还可以执行其他操作,例如获取一些用户输入并将其作为 Java 代码运行。
注意:这与 Java 中是否有 eval() 函数不同?; 那只是eval()我想要的exec()。
在运行时,在我的Java程序中,给定一个String,我想知道返回类型.例如:
1 + 1 回报 int1L + 1L 回报 long1L + 1 回报 long1 + 1.5 回报 double1 + 2 - 3 * 4 / 5 回报 int1 / 0 回报 int1 + Math.nextInt() 回报 int1.5 + Math.nextInt() 回报 doubleColor.RED 回报 java.awt.Colora是一个int:a + 1returninta是一个int:a + 1.5returndouble没有必要实际评估代码:我只需要返回类型.如何使用JDK运行时编译器,ECJ JDT或任何其他纯Java依赖项执行此操作?
详细代码:以下是此代码的简化伪代码单元测试:
public static void ExpressionTyper {
public String determineType(String expression, Map<String, …Run Code Online (Sandbox Code Playgroud) 示例---对于SQL,我们将SQL语句编写为String,然后执行
strsql = "Select * from international_table ";
Run Code Online (Sandbox Code Playgroud)
现在我们做什么,我们类似地执行这个声明
我想在java或c#
像这样
strjavacode = "String str = \" Masdfksdja \";System.out.Println(str); "
Run Code Online (Sandbox Code Playgroud)
之后会有一些如何执行此操作
我渴望做这样的事情,我不必多次声明变量和赋值或语句.