在Java中的隐式参数
我在Java 8中找到了一个让我感兴趣的方法,它是添加在Parameter这个类中的。
isImplicit() | 参数 (Java 8 平台)
如果该参数在源代码中是隐式声明的,则返回true;否则返回false。
在Java中有隐式参数吗?
在Java中也能够做到类似于Scala中implicit的东西吗?
具有 isImplicit() 为真的东西
经过调查,似乎不能像 Scala 的 implicit 那样做。
import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;
public class Main {
public static void main(String[] args) throws Exception {
Constructor<InnerClass> constructor = InnerClass.class.getConstructor(Main.class);
Parameter parameter = constructor.getParameters()[0];
System.out.println(
"name : " + parameter.getName() + "\n" +
"implicit : " + parameter.isImplicit()
);
}
public class InnerClass {}
}
使用「-parameters」选项进行编译
$ javac -parameters Main.java
一旦执行,
$ java Main
name : this$0
implicit : true
这样就会变成这样。
从非静态内部类的默认构造函数获取参数时,isImplicit()返回true。
据说发生的情况是,非静态内部类在编译时会生成如下代码。
public class InnerClass {
private Main parent;
public InnerClass(final Main this$0) {
this.parent = this$0;
}
}
这样一来,即使在源代码上没有明确写出,但在编译时生成的参数被称为隐式参数。(我对英语的解读可能不准确)
(顺便说一句,如果在编译时没有指定 -parameters 选项,isImplicit()就会返回false)
如果 isImplicit() 是true,那么还有一个选择是使用 enum 的 valueOf()。
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class Main {
public static void main(String[] args) throws Exception {
Method valueOf = MyEnum.class.getMethod("valueOf", String.class);
Parameter parameter = valueOf.getParameters()[0];
System.out.println(
"name : " + parameter.getName() + "\n" +
"implicit : " + parameter.isImplicit()
);
}
public static enum MyEnum {}
}
name : name
implicit : true
请参考
- Implicit and Synthetic Parameters | Obtaining Names of Method Parameters (The Java™ Tutorials > The Reflection API > Members)