反射
- 反射机制:通过一个抽象的类名能在自己记忆(加载类的内存)中找到匹配的类的具体信息。
Person p = new Person();
Class c = Person.class;
Class c1 = p.getClass();
try {
Class c2 = Class.forName("day13.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class superclass = c.getSuperclass();
System.out.println("父类:"+superclass.getName());
Class[] interfaces = c.getInterfaces();
for (Class c1 : interfaces) {
System.out.println("接口"+c1.getName());
}
Class c = Class.forName("day13.Person");
Constructor[] con = c.getConstructors();
for (Constructor con1 :con){
System.out.println("构造方法名"+con1.getName());
System.out.println("构造方法修饰符为"+con1.getModifiers());
Class[] c2 = con1.getParameterTypes();
for(Class clazz :c2){
System.out.println(clazz);
}
System.out.println("--------------");
}
Constructor[] con2 = c.getDeclaredConstructors();
for (Constructor con3 :con2){
System.out.println("构造方法名"+con3.getName());
System.out.println("构造方法修饰符为"+con3.getModifiers());
Class[] c3 = con3.getParameterTypes();
for(Class clazz1 :c3){
System.out.println(clazz1);
}
System.out.println("--------------");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class clazz = Class.forName("day13.Student");
Object obj = clazz.newInstance();
Student s = (Student) obj;
System.out.println(s.school);
Constructor c = clazz.getConstructor(String.class);
Student stu = (Student)c.newInstance("张三");
System.out.println(stu.name);
Constructor c = clazz.getDeclaredConstructor(String.class,String.class);
c.setAccessible(true);
Student stu = (Student) c.newInstance("李四","希望小学");
System.out.println(stu.name+stu.school);
Method[] ms = clazz.getDeclaredMethods();
for(Method m : ms){
System.out.println("方法的名称"+m.getName());
System.out.println("方法的修饰符"+m.getModifiers());
System.out.println("返回值的类型"+m.getReturnType());
Class[] cl = m.getParameterTypes();
if(cl != null && cl.length > 0){
for(Class c : cl){
System.out.println("参数类型"+c.getName());
}
}
System.out.println("------------");
}
Field[] f= clazz.getDeclaredFields();
for (Field f1 : f) {
System.out.println("属性的名称"+f1.getName());
System.out.println("属性的修饰符"+f1.getModifiers());
System.out.println("属性的类型"+f1.getType());
System.out.println("---------");
}
Package p = clazz.getPackage();
System.out.println(p.getName());
Constructor c = clazz.getConstructor(String.class);
Object obj = c.newInstance("张三");
Method m = clazz.getMethod("setInfo", String.class, String.class);
m.invoke(obj,"张三","希望小学");
Method m1 = clazz.getDeclaredMethod("test",String.class);
m1.setAccessible(true);
m1.invoke(obj,"张三");
Method m2 = clazz.getMethod("getSchool");
String s = (String)m2.invoke(obj);
System.out.println(s);
Constructor con = clazz.getConstructor(String.class);
Student s = (Student) con.newInstance("沙城一小");
Field f = clazz.getField("school");
f.set(s,"希望小学");
System.out.println(f.get(s));
Field f1 = clazz.getDeclaredField("privateField");
f1.setAccessible(true);
f1.set(s,"1");
System.out.println(f1.get(s));
public class ProxyDemo implements InvocationHandler {
Object obj;
public ProxyDemo(Object obj){
this.obj =obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName()+"方法开始执行");
Object result = method.invoke(this.obj,args);
System.out.println(method.getName()+"方法执行完毕");
return result;
}
}
public class TestDemoImp1 implements ITestDemo{
@Override
public void test1() {
System.out.println("执行test1");
}
@Override
public void test2() {
System.out.println("执行test2");
}
@Override
public void test3() {
System.out.println("执行test3");
}
}
public interface ITestDemo {
void test1();
void test2();
void test3();
}
ITestDemo t = new TestDemoImp1();
InvocationHandler handler = new ProxyDemo(t);
ITestDemo t1 =(ITestDemo)Proxy.newProxyInstance(handler.getClass().getClassLoader(),t.getClass().getInterfaces(),handler);
t1.test1();
t1.test2();
t1.test3();