文章目录
1.什么是反射
通过反射机制,可以了解任意一个对象所属类的成员变量和方法,也可以调用变量和方法,取得全部结构,实现全部接口,等
2.获取类的名称
举个简单的例子,如果现在有一个类,现在通过这个类创建对象,要想通过这个对象获取到类的名称,则需要通过反射机制。
代码展示:
package com.gaoji_fanshe;
class x{
}
public class text {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Class<?> c1=null; // 指定泛型
// 方式1:
try {
c1=Class.forName("com.gaoji_fanshe.x"); // 最常用的方式
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(c1.getName());
// 方式二:
x x1=new x(); //实例化对象x
System.out.println(x1.getClass().getName()); //得到对象所在的类
// 方式三:
Class class1=x.class;
System.out.println( class1.getName());
}
}
运行结果:
我们可以看到获取到了类所在包名和类名,同时有一个方法getClass(),这个方法在哪里定义的呢?
任何一个没有明确声明继承那个父类时,则默认继承Object类。
定义Class类:
Class本身表示一个类的本身,通过Class可以完整地得到一个类中的完整结构,包括类中的方法定义,属性等定义。
3.取得一个类中的属性
1.通过getField()方法可以获取到定义的公共属性(public)
如果是父类中公共的属性也可以获取
2.获取所有的公共属性:
方法:getFields();
package com.gaoji_fanshe;
public class User {
private String id;
private String name;
public int age;
}
package com.gaoji_fanshe;
import java.lang.reflect.Field;
public class Text02 {
public static void main(String[] args) {
Class class1=User.class; //实例化class
Field[] c1=class1.getFields(); //获得所有公共的属性
for (Field field : c1) {
System.out.println(field);
}
}
}
运行结果:
4.获取当前类所有的属性,getDeclaredFields()方法
结果:
5.获取当前类所有的属性,getDeclaredMethods()
获取方法:代码同上,只需改一下类型和方法即可
获取当前类+父类中所有公共的方法:getMethods();
获取当前类中所有的方法:getDeclaredMethods();
6.通过反射操作属性:
newInstance()方法:
可以根据之前传入的完整的“包,类”名称进行实例化对象操作,完全取代了之前使用new的操作方式
注意:
被实例化对象的类中必须存在无参构造方法,如果不存在,则肯定无法被 实例化的。
通过反射操作属性:
在反射操作中也可以使用Method来调用类中的set,和get方法,但是比较麻烦,我们讲解这一种。
package com.gaoji_fanshe;
import java.lang.reflect.Field;
import java.util.Set;
public class Text03 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
Class c1=User.class; //实例化Class对象
Object obj=c1.newInstance(); // 实例化对象
System.out.println(obj);
Field field=c1.getDeclaredField("id");
Field field1=c1.getDeclaredField("name"); //取得属性
Field field2=c1.getDeclaredField("age");
field.setAccessible(true);
field1.setAccessible(true); //获取权限
field2.setAccessible(true);
field.set(obj, "01");
field1.set(obj, "FBM"); //设置值
field2.set(obj, 18);
System.out.println("id:"+field.get(obj));
System.out.println("name:"+field1.get(obj)); //获取值
System.out.println("age:"+field2.get(obj));
}
}
运行结果:
这是一个比较使用的通过反射来操作属性例子,也可以操作构造方法,赋值调用等。
后期可以通过反射配合上注解获取到属性加上sql语句对数据库的操作,后面博客会写到。