https://docs.oracle.com/javase/tutorial/reflect/index.html
反射静态函数,私有函数, 公共函数用的接口一样吗?
public属性的,继承到的可以通过 getMethod获得, 而静态的,私有的method 要通过getDeclaredMethod获得,类的属性Field 是同样的道理
public Method getMethod(String name, Class<?>... parameterTypes)
Returns a Method object that reflects the specified public member method of the class or interface represented by this Class object.
Static methods declared in superinterfaces of the class or interface represented by this Class object are not considered members of the class or interface.
怎样调用函数
Reflection provides a means for invoking methods on a class. Typically, this would only be necessary if it is not possible to cast an instance of the class to the desired type in non-reflective code. Methods are invoked with java.lang.reflect.Method.invoke()
. The first argument is the object instance on which this particular method is to be invoked. (If the method is static
, the first argument should be null
.) Subsequent arguments are the method's parameters.
静态函数第一个参数是null, 但绝对不能省略
IBinder binder = (IBinder) getService.invoke(null, Context.MEDIA_PROJECTION_SERVICE);
projection = createProjection.invoke(service, uid, " xxx", TYPE_SCREEN_CAPTURE, false);
反射的作用
Extensibility Features
An application may make use of external, user-defined classes by creating instances of extensibility objects using their fully-qualified names.
Class Browsers and Visual Development Environments
A class browser needs to be able to enumerate the members of classes. Visual development environments can benefit from making use of type information available in reflection to aid the developer in writing correct code.
Debuggers and Test Tools
Debuggers need to be able to examine private members on classes. Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite.
Lesson: Classes
Every type is either a reference or a primitive. Classes, enums, and arrays (which all inherit from java.lang.Object
) as well as interfaces are all reference types. Examples of reference types include java.lang.String
, all of the wrapper classes for primitive types such as java.lang.Double
, the interface java.io.Serializable
, and the enum javax.swing.SortOrder
.
There is a fixed set of primitive types: boolean
, byte
, short
, int
, long
, char
, float
, and double
.
For every type of object, the Java virtual machine instantiates an immutable instance of java.lang.Class
which provides methods to examine the runtime properties of the object including its members and type information. Class
also provides the ability to create new classes and objects. Most importantly, it is the entry point for all of the Reflection APIs. This lesson covers the most commonly used reflection operations involving classes:
Retrieving Class Objects
The entry point for all reflection operations is java.lang.Class
. To get to these classes, it is necessary to invoke appropriate methods on Class
. There are several ways to get a Class
depending on whether the code has access to an object, the name of class, a type, or an existing Class
.
Object.getClass()
Class.forName()
If the fully-qualified name of a class is available, it is possible to get the corresponding Class
using the static method Class.forName()
. This cannot be used for primitive types. The syntax for names of array classes is described by Class.getName()
. This syntax is applicable to references and primitive types.
Class c = Class.forName("com.duke.MyLocaleServiceProvider");