-
2、类名.class
-
3、Class.forName(“完整的类路径”)
*/
@Test
public void getClassTest() {
//第一种:对象.getClass()
Dog dog = new Dog(“wangwang”, 2, “yellow”);
Class<? extends Dog> aClass = dog.getClass();
//第二种:类名.class
Class dogClass = Dog.class;
//第三种:Class.forName(“完整的类路径”)
try {
Class<?> aClass1 = Class.forName(“com.vince.Dog”);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
====================================================================================
代码如下:
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
public class ReflectionDemo {
/**
- 通过反射来实例化目标类对象
*/
@Test
public void test1(){
Class dogClass = Dog.class;
try {
//通过Class对象(dogClass)来实例化类对象,调用了该类默认的无参的构造方法(所以创建Dog类的时候无参的构造方法要保留呢);此时可以正常使用dog对象了
Dog dog = ((Dog) dogClass.newInstance()); //所以这里是没有参数的newInstance()
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Test
public void test2(){
Class dogClass = ( Dog.class);
//获取目标类的所有构造方法
Constructor<?>[] constructors = dogClass.getConstructors(); //通过Class对象(dogClass),得到该类Dog的所有构造方法。返回的是一个数组
for (int i = 0; i <constructors.length ; i++) {
System.out.println(constructors[i].getName()); //循环遍历,获取每个构造方法的名称
System.out.println(constructors[i].getParameterCount()); //获取每个构造方法的参数数量
System.out.println(constructors[i].getParameterTypes()); //获取构造方法的参数类型
}
//获取指定的构造器
try {
//获取指定的构造器;因为参数要传入原类的属性,所以用String.class 也是一种“类名.class”的方式
Constructor constructor = dogClass.getConstructor(String.class, int.class, String.class);
//调用带参数的构造器来实例化对象,因为有参所以这里newInstance()需要传入具体的参数
Dog dog = constructor.newInstance(“haha”, 3, “white”);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
//获取属性
@Test
public void test3(){
Class dogClass = Dog.class;
//获取目标类的所有属性的的一个抽象对象,返回的是一个数组;且这种只能获取公有的属性
Field[] fields = dogClass.getFields();
//System.out.println(fields.length);
//获取私有的以及公有的属性;即所有的属性
Field[] declaredFields = dogClass.getDeclaredFields();
//System.out.println(declaredFields.length);
int len = declaredFields.length;
for (int i = 0; i <len ; i++) {
int modifiers = declaredFields[i].getModifiers(); //获取每个属性的修饰符,但是这么获取的是修饰符的整数值(JVM自动给转换了)
String modifilesName = Modifier.toString(modifiers); //因此可用修饰符的一个类Modifier.toString()方法再转换成字符串
System.out.println(modifilesName+" “+declaredFields[i].getType()+” "+declaredFields[i].getName());
}
}
}
==========================================================================================
目录结构如下:
有2种方式:
第一种,直接配置:
signingConfigs {
debug {
storeFile file(“app/keystore.properties”)
storePassword “111111”
keyAlias “key”
keyPassword “111111”
}
release {
storeFile file(“app/keystore.properties”)
storePassword “111111”
keyAlias “key”
keyPassword “111111”
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
signingConfig signingConfigs.release
}
}
第二种,通过读取文件
新建keystore.properties文件
storeFile=keyStore.jks
storePassword=123456
keyAlias=encrypt
keyPassword=123456
build.gradle配置
signingConfigs {
// 从keystore.properties文件中读取信息
def keystorePropertiesFile = rootProject.file(“app/keystore.properties”)
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
debug {
println("======== debug mode: set key ========")
storeFile file(keystoreProperties[‘storeFile’])
storePassword keystoreProperties[‘storePassword’]
keyAlias keystoreProperties[‘keyAlias’]
keyPassword keystoreProperties[‘keyPassword’]
}
release {
println("======== release mode: set key ========")
storeFile file(keystorePro
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
perties[‘storeFile’])
storePassword keystoreProperties[‘storePassword’]
keyAlias keystoreProperties[‘keyAlias’]
keyPassword keystoreProperties[‘keyPassword’]
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
signingConfig signingConfigs.release
}
}
===============================================================================
Hook机制是回调机制的一种,普通的回调是静态的,我们必须提前写好回调接口;而Hook机制在Java中则可以利用反射,针对切入点(通常是一个成员变量),采用替换的手段,使代码在运行时改变,听起来有些抽象,下面简单介绍下,然后我看代码。
寻找适合Hook点,它应该是一个成员变量,并且应该在我们需要注入的方法中调用过它的方法,或者使用了它的的值;
创建继承自Hook点的对象的子类,根据需求修改其相应的方法;
使用反射将我们自己创建的对象替换对象实例中的对象,达到偷梁换柱的目的。
public class Hero {
private Weapon weaponMain;
public Hero(Weapon weaponMain) {
this.weaponMain = weaponMain;
}
public void attack(){
weaponMain.attack();