JVM(尤其是HotSpot VM)因其在运行时可以应用的大量优化而闻名.
有没有办法查看某段代码,看看JVM实际上对它做了什么?
java compiler-construction optimization jvm vm-implementation
考虑以下代码:
public example(String s, int i, @Foo Bar bar) {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
我想检查方法是否有注释@Foo并获取参数或如果没有@Foo找到注释则抛出异常.
我目前的方法是首先获取当前方法,然后遍历参数注释:
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
class Util {
private Method getCurrentMethod() {
try {
final StackTraceElement[] stes = Thread.currentThread().getStackTrace();
final StackTraceElement ste = stes[stes.length - 1];
final String methodName = ste.getMethodName();
final String className = ste.getClassName();
final Class<?> currentClass = Class.forName(className);
return currentClass.getDeclaredMethod(methodName);
} catch (Exception cause) {
throw new UnsupportedOperationException(cause);
}
}
private Object getArgumentFromMethodWithAnnotation(Method method, Class<?> annotation) {
final …Run Code Online (Sandbox Code Playgroud) 我已经看过关于模拟Javaenum和案例类与Enumeration的Scala问题,但似乎太多的努力,太少的好处.
基本上我想有一个values方法返回所有单例对象DayOfWeek而不重复自己几次.
这就是我的代码应该是这样的:
object DayOfWeek extends MyEnum {
object MONDAY extends DayOfWeek(1)
object TUESDAY extends DayOfWeek(2)
object WEDNESDAY extends DayOfWeek(3)
object THURSDAY extends DayOfWeek(4)
object FRIDAY extends DayOfWeek(5)
object SATURDAY extends DayOfWeek(6)
object SUNDAY extends DayOfWeek(7)
}
class DayOfWeek(ordinal: Int)
Run Code Online (Sandbox Code Playgroud)
该方法values应返回类似如下所示的内容:
val values = Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY, SUNDAY)
Run Code Online (Sandbox Code Playgroud)
一切都应该在MyEnum特质中发生,所以我只需要扩展它来获得功能.
trait MyEnum {
val values = this.getClass.getField("MODULE$") etc. etc.
}
Run Code Online (Sandbox Code Playgroud)
有什么建议可以做到这一点吗?这个想法是values访问类并找到它们正在扩展的类的所有单例对象. …
考虑以下代码:
var unit: Unit = null
unit: Unit = ()
Run Code Online (Sandbox Code Playgroud)
a)为什么我允许将null赋给值类?(见§12.2.3)
b)为什么null转换为()?
考虑这样的事情:
object Singleton
val cls: Class[Singleton] = ???
Run Code Online (Sandbox Code Playgroud)
我需要写什么而不是????
我试过classOf[Singleton],classOf[Singleton.type],Singleton.type,但毫无效果.
(我当然知道getClass,运行时版本classOf,但那不是我要问的.)
我需要配置什么以及自动运行什么?据我所知,使用两者都可能有点棘手,因为两者都使用字节码编织.我可以继续使用更方便的配置语法,还是需要"完整"的Scala版本?
目前我正在尝试使用Maven,但没有取得多大成功.
我首先考虑使用ITD来定义private static final Logger logger = ...一些不相关的案例,但它看起来不像使用它作为演示示例的明显改进.
是否有一些标准/建议的ITD使用示例,人们应该将其用于教学目的?
F#有类型和无类型的代码引用,我想知道哪个用户会选择一个而不是另一个?
区别只是方便和无类型和类型化的引用在所有情况下都可以转换为每种情况,或者是类型化的引用,例如可能使用无类型引用的子集?
有没有任何例子只适用于打字,但没有使用无类型报价 - 或者相反?
我正在尝试构建一些类似SQL的抽象,我遇到了一个问题.
这是一个简化的"数据库表":
trait Coffee {
def id: Long
def name: String
def brand: String
}
Run Code Online (Sandbox Code Playgroud)
这是我的查询抽象:
import language.experimental.macros
object Query {
def from[T] =
macro QueryMacros.fromMacro[T]
}
class From[T] {
def select[S](s: T => S): Select[T] =
macro QueryMacros.selectMacro[T, S]
}
class Select[T] {
def where(pred: T => Boolean): Where =
macro QueryMacros.whereMacro[T]
}
class Where(val result: String)
Run Code Online (Sandbox Code Playgroud)
这是我的宏实现:
import scala.reflect.macros.Context
object QueryMacros {
val result = new StringBuilder
def fromMacro[T : c.WeakTypeTag](c: Context): c.Expr[From[T]] = {
result ++= ("FROM …Run Code Online (Sandbox Code Playgroud)