方法类 | Java中的 isBridge() 方法
Java.lang.reflect.Method.isBridge()方法用于检查函数是否为桥接函数。如果方法对象是桥方法,则此方法返回 true,否则返回 false。
桥接方法:这些方法在源函数和目标函数之间创建中间层。它通常用作类型擦除过程的一部分。这意味着桥方法需要作为类型安全的接口。
例如,在下面的示例中,以Object为参数的 compare() 方法表现为桥方法。它将对象转换为字符串并调用以字符串为参数的比较函数。所以compare (Object a, Object b)充当源(调用 compare() 的方法)和目标(compare(String, String))之间的桥梁部分。
例子:
public class compareValues implements Comparator {
// target method
public int compare(String a, String b)
{
}
// bridge method
public int compare(Object a, Object b) {
return compare((String)a, (String)b);
}
}
句法:
public boolean isBridge()
返回值:如果方法对象是 JVM 规范的桥接方法,则此方法返回true ,否则返回false 。
下面的程序说明了 Method 类的 isBridge() 方法:
程序 1:返回 BigInteger 类的所有 Bridge 方法的程序。
说明:在这个方法中首先创建了 BigInteger 类对象。创建对象后,通过调用 Object 类的 getMethods() 创建一个方法对象列表。现在迭代获取的方法列表并检查 isBridge()。因此我们得到了桥接方法。最后打印桥接方法名称。
/*
* Program Demonstrate isBridge() method
* of Method Class.
*/
import java.lang.reflect.Method;
import java.math.BigInteger;
public class GFG {
// create main method
public static void main(String args[])
{
try {
// create BigInteger class object
Class bigInt = BigInteger.class;
// get list of Method object
Method[] methods = bigInt.getMethods();
System.out.println("Bridge Methods of BigInteger Class are");
// Loop through Methods list
for (Method m : methods) {
// check whether the method is Bridge Method or not
if (m.isBridge()) {
// Print Method name
System.out.println("Method: " + m.getName());
}
}
}
catch (Exception e) {
// print Exception is any Exception occurs
e.printStackTrace();
}
}
}
Bridge Methods of BigInteger Class are
Method: compareTo
程序 2:检查自定义方法 isBridge() 与否。
说明:当子类从父类继承方法时,继承的方法充当桥接方法。在此 Code First 中,创建了一个包含 draw 方法的 Shape 类,然后创建了一个扩展 Shape 类的 Rectangle 类。在 main 方法中,创建了 Rectangle 类的 draw 方法的 Method 对象。现在检查是否是Bridge()方法。最后打印结果。
// Program Demonstrate isBridge() method
// of Method Class.
// In this program a custom bridge method is created
// and by use of isBridge(), checked for Bridge Method
import java.lang.reflect.Method;
public class GFG {
// create class
protected class Shape {
public void draw() {}
}
// create a class which extends Shape class
public class Rectangle extends Shape {
}
// create main method
public static void main(String args[])
{
try {
// create class object for class
// Rectangle and get method object
Method m = Rectangle.class.getDeclaredMethod("draw");
// check method is bridge or not
boolean isBridge = m.isBridge();
// print result
System.out.println(m + " method is Bridge Method :"
+ isBridge);
}
catch (NoSuchMethodException | SecurityException e) {
// Print Exception if any Exception occurs
e.printStackTrace();
}
}
}
public void GFG$Rectangle.draw() method is Bridge Method :true
参考:
https://docs.oracle.com/javase/8/docs/api/java Java
https://stackoverflow.com/questions/5007357/java-generics-bridge-method
http://stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html