一、调用构造方法
1、通过Class类提供的newInstance()方法可以实例化一个类
Person p = Person.class.newInstance();
//局限性在于 实例化只能调用 public属性的 无参构造方法
2、通过构造器来调用构造方法 Constructor 对象
getConstructor(Class...)
:获取某个public
的Constructor
;getDeclaredConstructor(Class...)
:获取某个Constructor
;getConstructors()
:获取所有public
的Constructor
;getDeclaredConstructors()
:获取所有Constructor
。
注意:Constructor
总是调用当前类的构造方法,不存在多态的问题;调用非public
的Constructor
时,必须首先通过setAccessible(true)
设置允许访问。setAccessible(true)
可能会失败。
import java.lang.reflect.Constructor;
public class GetConstructor {
public static void main(String[] args) throws Exception {
System.out.println("-----------测试使用Constructor构造器------------");
Constructor c1 = Integer.class.getConstructor(String.class); //接受的参数类型是Class类
Integer i = (Integer) c1.newInstance("123");
System.out.println(i);
}
}
二、获取继承关系
在Class类中提到过,获取Class类有三种方法,同时注意JVM对于每个加载的Class只创建一个Class实例,因此下面三种方式获取到的是一个Class类:
getClass()方法
获取forName(参数:完全限定名)方法
获取class属性
获取
1、获取父类的Class getSuperclass()
2、获取所有实现的接口的Class getInterfaces()
,只能获取当前类实现的接口,不能获得父类实现的接口
3、通过Class
对象的isAssignableFrom()
方法可以判断一个向上转型是否可以实现
public class GetExtend {
public static void main(String[] args) {
System.out.println("------------测试通过反射获取继承------------");
Class c1 = Integer.class;
//获取父类的Class, 因此还是Class类
Class sc1 = c1.getSuperclass();
System.out.println(sc1);
//获取当前类实现的接口
Class[] i = c1.getInterfaces();
System.out.println(i.length);
for(Class j : i){
System.out.println(j);
}
// 通过 isAssignableFrom 判断向上转型是否成功
System.out.println(Integer.class.isAssignableFrom(Number.class)); //False
//Number对象 转到Integer 是向下转型,所以结果为False
System.out.println(Number.class.isAssignableFrom(Integer.class));
}
}
三、动态代理
主要通过 Proxy.newProxyInstance()
来实现,动态代理相对于静态而言,指的是在运行期间,创建某个 interface
实例
package reflect;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* @className:DynamicProxy;
* @time:2022-05-19-20:36;
* @author:Lee Ye;
* @description:这是一个java示例;
*/
public class DynamicProxy {
public static void main(String[] args) {
InvocationHandler handle = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method);
if (method.getName().equals("morning")){
System.out.println("Good morning");
System.out.println(args.length);
for(Object i: args){
System.out.println(i);
}
}
return null;
}
};
Hello hello = (Hello) Proxy.newProxyInstance(
Hello.class.getClassLoader(),
new Class[]{Hello.class},
handle
);
hello.morning("3ackr0d");
}
}
interface Hello{
void morning(String name);
}