1.什么是Java 的反射机制
答:在运行状态中,对于任意一个类,可以获取它的有属性和方法;对于任意一个对象,都能调用它的任意一个属性或方法。这种在运行时动态地获取信息,调用对象属性和方法的功能,就是反射机制。
2.Java 中的反射机制有什么作用
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时判断任意一个对象所属的类;
- 在运行时任意调用一个类的对象;
- 在运行时任意调用一个对象的方法。
- 总而言之,就是能让java代码更加灵活。
3.反射有哪些优缺点
答:优点:让程序更加灵活。
缺点:破坏了封装性、降低了性能、安全性、可维护性及代码的可读性。
4.反射常见的用法有哪些。或者你在框架中哪些地方见过反射的使用?
答:动态代理、JDBC 的class.forName、Spring 的IOC/DI 。
5.三种获取类的字节码(Class)对象的方式
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("com.sunlee.domain.Person");//字节码文件阶段
Class c2 = Person.class;//加载进内存阶段
Person person = new Person();
Class c3 = person.getClass();//实例化对象阶段
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c1==c2);//true
System.out.println(c1==c3);//true
}
5.获取、设置属性
public static void main(String[] args) throws Exception {
//获取属性
// personClass.getField("a");
// personClass.getFields();
// personClass.getDeclaredField("a");
// personClass.getDeclaredFields();
Class personClass = Person.class;
Field[] fields = personClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("-------------");
Field a = personClass.getField("a");
Person p = new Person();
Object value = a.get(p);
System.out.println(value);
a.set(p,"张三");
System.out.println(p);
System.out.println(a.get(p));
System.out.println("-------------");
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("-------------");
Field d = personClass.getDeclaredField("d");
d.setAccessible(true);//暴力反射
Object value2 = d.get(p);
System.out.println(value2);
}
6.构造函数(作用:实例化)
public static void main(String[] args) throws Exception {
//主要用于创建对象
Class personClass = Person.class;
System.out.println("遍历构造方法-------------");
Constructor[] constructors = personClass.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
System.out.println("带参构造-------------");
Constructor constructor = personClass.getConstructor(String.class, int.class);
System.out.println(constructor);
Object p = constructor.newInstance("张三",22);
System.out.println(p);
System.out.println("无参构造-------------");
Constructor constructor1 = personClass.getConstructor();
System.out.println(constructor1);
Object p1 = constructor1.newInstance();
System.out.println(p1);
System.out.println("常使用的快捷无参构造-------------");
Object o = personClass.newInstance();
System.out.println(o);
}
7.调用方法
public static void main(String[] args) throws Exception {
//调用方法
Class personClass = Person.class;
System.out.println("遍历----------");
Method[] methods = personClass.getMethods();
for (Method method : methods) {
System.out.println(method);
System.out.println(method.getName());
}
System.out.println("空参方法----------");
Method eat = personClass.getMethod("eat");
Person p = new Person();
eat.invoke(p);//执行
System.out.println("带参方法----------");
Method eat2 = personClass.getMethod("eat",String.class);
Person p2 = new Person();
eat2.invoke(p2,"吃饭");//执行
//获取类名
String className = personClass.getName();
System.out.println(className);
}