目录
代码:
Class cls = Person.class; //获取自描述类
String strClassName = cls.getName();获取类的包名 + 类名
输出(strClassName);
首先我们的Class类是自描述类.可以返回这个类的描述信息. 有很多方法.比如获取类名字,方法.构造等等.
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
Class cls = Class.forName("com.ibinary_01.Person");//传入完整类名获取Class
String clsName = cls.getName();
System.out.println(clsName);
}
可以看到,我们使用forName必须传入完整的类名.
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
Class cls = new Person().getClass();
String clsName = cls.getName();
System.out.println(clsName);
}
三个的输出结果都一样,演示一下
通过以上图片可以看到. 我们可以获得包的路径. 我们上面使用的getName(); 那么我们还可以使用getSuperclss(); 获得父类自描述类(Class),然后继续调用getName();获取父类的名称. 代码例子如下:
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
Class cls = new Person().getClass();
Class supercls = cls.getSuperclass();
System.out.println(supercls.getName());
}
当然,我使用的是getClass();首先获得自己的Class,然后在获取父类的Class,最后调用父类的Class的getName();获得类名. 我们也可以使用上面所说的三种方法.
可以看到,以上是我们Class为构造方法提供的方法获取.
上面标题有点绕,反正就是对我们的类的方法.提供方法去操作.或者获取.
一样的,对我们的成员变量也提供了方法操作.
请注意 newInstance.我们可以利用指定参数.创建一个该类对象.在以后的安卓逆向中.可能会需要. 2.Modifier类 这个类则是传入类型则是调用Construct类中的getModifiers();返回构造方法的类型.传入.然后可以判断是什么属性. 提供的方法
1.获取所有公共权限的构造方法
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
getAllConstruct(Person.class);
}
static void getAllConstruct(Class<?> cls) {
//第一种,获得所有的构造方法
Constructor c[] = cls.getConstructors();
//遍历输出
for(Constructor i:c) {
System.out.println(i);
}
}
可以看到,上边调用的就是getConstructors():获得了所有公共权限的方法,进行遍历输出了. 输出结果:
private static void getPublicConstruct(Class<Person> cls) {
// TODO 自动生成的方法存根
try {
Constructor<Person> c = cls.getConstructor(String.class,int.class);//获取指定公共权限的Construct
c.newInstance("1",2); //创建构造方法,并且调用
} catch (Exception e) {
e.printStackTrace();
}
}
获取公共的权限的指定构造方法,我们就需要传入类型的Class. 比如参数为 int.Class 代表一个参数. 下方调用newInstance();就是在使用这个构造.
private static void getAllConstruct(Class<Person> cls) {
// TODO 自动生成的方法存根
Constructor a[] = cls.getDeclaredConstructors();
for(Constructor i:a) {
System.out.println(i);
}
}
输出结果:
获得指定的就跟上面一样.比如这次我们获得priate权限的方法.并且调用它.
private static void getPrivateConstructAnNewInstance(Class<Person> cls) throws InstantiationException, IllegalAccessException {
// TODO 自动生成的方法存根
try {
Constructor<Person> a = cls.getDeclaredConstructor(int.class,int.class,int.class);//获得指定的
a.setAccessible(true);
a.newInstance(1,1,1);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
首先我们要使用 getDeclaredConstructor(int.Class...);获取指定的构造方法 因为是私有的,所以我们要使用构造方法类提供的 setAccessible(true);设置为共有的. 此时我们在使用newInstance(对应参数类型的参数); 即可实现调用. 结果图:
其实这个方法上面也提供了.叫做 getParameterTypes();这个方法返回一个Class数组. 我们遍历这个数组即可.
private static void getPrivateConstructAnNewInstance(Class<Person> cls) throws InstantiationException, IllegalAccessException {
// TODO 自动生成的方法存根
try {
Constructor<?>[] a = cls.getConstructors();
for(Constructor i:a) {
System.out.println("构造函数 = " + i);//输出构造函数
Class Par[] = i.getParameterTypes();
for(Class j:Par) {
System.out.print(" " + j);//输出参数类型
}
System.out.println();
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
输出结果:
private static void getPublicAllFields(Class<Person> cls) {
// TODO 自动生成的方法存根
Field[] f = cls.getFields();//获取所有成员变量
for(Field i:f) {
System.out.println(i);
}
}
使用方法getFields()即可.输出之后会显示所有的名字.
使用方法: getField(String name);
private static void getPublicAllFields(Class<Person> cls) {
// TODO 自动生成的方法存根
Field f;
try {
f = cls.getField("pid");
System.out.println(f);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
结果同上,我们需要传入名字才可以.
private static void getPublicAllFields(Class<Person> cls) {
// TODO 自动生成的方法存根
Field a[] = cls.getDeclaredFields();
for(Field i:a) {
System.out.println(i);
}
}
输出结果:
private static void getPublicAllFields(Class<Person> cls) {
// TODO 自动生成的方法存根
try {
Field a = cls.getDeclaredField("name");
System.out.println(a);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
我们上面可以获取.但是我们要使用.或者要更改值. 二个步骤. 1.获取Cls new出来的实例对象. 2.使用Set方法设置值. 如果设置私有,则要设置权限才可以.
private static void getPublicAllFields(Class<Person> cls) throws Exception {
// TODO 自动生成的方法存根
Object obj = cls.newInstance();
try {
Field a = cls.getDeclaredField("name");
a.setAccessible(true); //使用私有就要设置权限.
a.set(obj, "张三");
System.out.println(a.get(obj));//并且获取设置的成员变量值.
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
结果: