java中的反射机制及其一系列的操作方法
1.获取反射的源头的方式
1)类名.class Class cls1=String.class; |
---|
2)对象.getClass() Class cls2 = “abc”.getClass(); |
3)Class.forName(“包名.类名”) -->推荐 Class cls3=Class.forName(“java.lang.String”); |
2.反射机制可以实现的部分功能
2.1查看修饰符(public、private等)
getModifiers() 返回Java语言修饰符(public等)的类或接口,编码是一个整数。
Class<String> cls=String.class;
System.out.println(cls.getModifiers()); //17
String str = Modifier.toString(cls.getModifiers()); //public final
System.out.println(str);
2.2查看类所属的包
getPackage()
//package java.lang, Java Platform API Specification, version 1.8
System.out.println(cls.getPackage());
2.3查看实体的名称
getName()返回的实体的名称(数组类,接口,类、原始类型或空白)
getSimpleName()返回底层类的简单的名称
System.out.println(cls.getName()); //java.lang.String
System.out.println(cls.getSimpleName()); //String
2.4反射操作构造器
注:如果是通过私有构造器来动态创建对象时,先要通过 构造器.setAccessible(true);来开放权限
getConstructor(类<?>… parameterTypes)获取某个指定的公共的构造器
getConstructors()获取所有的公共的构造器getDeclaredConstructor(类<?>… parameterTypes)可以获取指定的构造器
getDeclaredConstructors()获取所有的构造器
public static void testConstructor(Class<User> cls) throws Exception {
//获取某个指定的公共的构造器
Constructor<User> con = cls.getConstructor(int.class, String.class, String.class, String.class, int.class);
System.out.println(con);
//所有的构造器
Constructor[] cons = cls.getDeclaredConstructors();
for(Constructor c:cons){
System.out.println(c);
}
//1.创建对象Class类的newInstance
User obj=cls.newInstance();
System.out.println(obj);
//2.constructor类提供的newInstance(Object... initargs)
User obj2=con.newInstance(1001,"lisi","lisi123","女",18);
System.out.println(obj2);
//私有的,可以放开权限
cons[1].setAccessible(true);
User obj3 = (User) cons[1].newInstance("lisi", "1234");
cons[1].setAccessible(false);
System.out.println(obj3);
}
2.5反射操作方法
注:反射获取方法的静态方法时,要将静态方法设置为public
getMethod(String name, 类<?>… parameterTypes)返回一个方法指定对象,反映了公共成员方法
getMethods()返回公共的所有方法getDeclaredMethod(String name, 类<?>… parameterTypes)返回一个公共的指定的方法
getDeclaredMethods()返回所有方法
public static void methodTest(Class<User> cls) throws Exception {
//获取
Method[] methods = cls.getDeclaredMethods();
System.out.println(Arrays.toString(methods));
Method method2 = cls.getMethod("setAge", int.class);
System.out.println(method2);
User user=cls.newInstance();
//调用方法
method2.invoke(user,10);
System.out.println(user);
//有返回值的,私有的
Method method3 = cls.getDeclaredMethod("test", int.class);
method3.setAccessible(true);
System.out.println(method3.invoke(user,12));
method3.setAccessible(false);
//静态方法设置为public,其他包才可以使用
//静态方法
cls.getDeclaredMethod("testStatic").invoke(null);
}
2.6反射操作属性
getField(String name)返回公共的属性
getFields()返回公共的所有属性getDeclaredField(String name)返回属性
getDeclaredFields()返回所有属性
public static void fieldTest(Class<User> cls) throws Exception {
Field field = cls.getDeclaredField("name");
System.out.println(field);
User user = cls.newInstance();
field.setAccessible(true);
field.set(user,"张三"); //设置属性值
System.out.println(field.get(user)); //获取属性值
System.out.println(cls.getDeclaredField("staticField").get(null));
}
本文地址:https://blog.csdn.net/qq_41943011/article/details/107347540
下一篇: 跟着我这样做肉丝拉皮,保证你吃了还想吃