什么是反射机制?

      JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制(注意关键词:运行状态)换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods
反射机制主要提供的功能 在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法; java Reflection API简介 Class类:代表一个类,位于java.lang包下
Field类:代表类的成员变量(成员变量也称为类的属性)
Method类:代表类的方法
Constructor类:代表类的构造方法
Array类:提供了动态创建数组,以及访问数组的元素的静态方法 java中的Class介绍 Class 类十分特殊,它没有共有的构造方法,被jvm调用的(简单的理解:new对象或者被类加载器加载的时候),在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
java中的Class三种获取方式 利用对象调用getClass()方法获取该对象的Class实例;
使用Class类的静态方法forName(),用类的名字获取一个Class实例 ;
运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例; 说明:在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。 //方式一
Person person = new Person();
Class<? extends Person> personClazz01 = person.getClass(); //方式二
try {
Class<?> personClazz02 = Class.forName("Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} //方式三
Class<? extends Person> personClazz03 = Person.class; java中的Class中一些重要的方法 public Annotation[] getAnnotations () 获取这个类中所有注解 getClassLoader() 获取加载这个类的类加载器 getDeclaredMethods() 获取这个类中的所有方法 getReturnType() 获取方法的返回类型 getParameterTypes() 获取方法的传入参数类型 isAnnotation() 测试这类是否是一个注解类 getDeclaredConstructors() 获取所有的构造方法 getDeclaredMethod(String name, Class… parameterTypes) 获取指定的构造方法(参数:参数类型.class) getSuperclass() 获取这个类的父类 getInterfaces() 获取这个类实现的所有接口 getFields() 获取这个类中所有被public修饰的成员变量 getField(String name) 获取指定名字的被public修饰的成员变量 newInstance() 返回此Class所表示的类,通过调用默认的(即无参数)构造函数创建的一个新实例 等等方法
如何通过反射获取私有成员变量和私有方法 Person类 /**
* Created by yuanyc on 2016/1/28.
*/
public class Person {
private String name = "zhangsan";
private String age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
} Person person = new Person();
//打印没有改变属性之前的name值
System.out.println("before:" + getPrivateValue(person, "name"));
person.setName("lisi");
//打印修改之后的name值
System.out.println("after:" + getPrivateValue(person, "name")); /**
* 通过反射获取私有的成员变量
*
* @param person
* @return
*/
private Object getPrivateValue(Person person, String fieldName) { try {
Field field = person.getClass().getDeclaredField(fieldName);
// 参数值为true,打开禁用访问控制检查
//setAccessible(true) 并不是将方法的访问权限改成了public,而是取消java的权限控制检查。
//所以即使是public方法,其accessible 属相默认也是false
field.setAccessible(true);
return field.get(person);
} catch (Exception e) {
e.printStackTrace();
}
return null;
} 运行结果:

获取私有方法的方式类似获取私有成员变量的方式
Filed类,Method类等详细查看开发者文档:
http://developer.android.com/intl/zh-cn/reference/java/lang/reflect/Field.html
案例演示反射 Person类 /**
* kaivens
*/
public class Person {
private int age;
private String name;
public Person(){ }
public Person(int age, String name){
this.age = age;
this.name = name;
} public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} } SuperPerson类 /**
* kaivens
*/
public class SuperPerson extends Person implements Smoke.Smoking{
private boolean isMan; public void fly()
{
System.out.println("走你~~");
} public boolean isMan() {
return isMan;
}
public void setMan(boolean iaMan) {
isMan = iaMan;
}
@Override
public void smoke(int count) { }
} Smoke接口类 /**
* kaivens
*/
public class Smoke {
public interface Smoking {
public void smoke(int count);
}
} MainActivity类 public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Tests();
} private void Tests() {
try {
//通过Java反射机制得到类的包名和类名
Test1();
System.out.println("==============================================="); //验证所有的类都是Class类的实例对象
Test2();
System.out.println("==============================================="); //通过Java反射机制,用Class 创建类对象[这也就是反射存在的意义所在],无参构造
Test3();
System.out.println("==============================================="); //通过Java反射机制得到一个类的构造函数,并实现构造带参实例对象
Test4();
System.out.println("==============================================="); //通过Java反射机制操作成员变量, set 和 get
Test5();
System.out.println("==============================================="); //通过Java反射机制得到类的一些属性: 继承的接口,父类,函数信息,成员信息,类型等
Test6();
System.out.println("==============================================="); //通过Java反射机制调用类中方法
Test7();
System.out.println("==============================================="); //通过Java反射机制获得类加载器
Test8();
System.out.println("===============================================");
} catch (Exception e) {
e.printStackTrace();
}
} /**
* Demo1: 通过Java反射机制得到类的包名和类名
*/
public static void Test1() {
Person person = new Person();
System.out.println("Test1: 包名: " + person.getClass().getPackage().getName() + "," + "完整类名: " + person.getClass().getName());
} /**
* Demo2: 验证所有的类都是Class类的实例对象
*/
public static void Test2() throws ClassNotFoundException {
//定义两个类型都未知的Class , 设置初值为null, 看看如何给它们赋值成Person类
Class<?> class1 = null;
Class<?> class2 = null; //写法1, 可能抛出 ClassNotFoundException [多用这个写法]
class1 = Class.forName("com.tuba.yuanyc.audiomanagerdemo.Person");
System.out.println("Test2:(写法1) 包名: " + class1.getPackage().getName() + "," + "完整类名: " + class1.getName()); //写法2
class2 = Person.class;
System.out.println("Test2:(写法2) 包名: " + class2.getPackage().getName() + "," + "完整类名: " + class2.getName());
} /**
* Demo3: 通过Java反射机制,用Class 创建类对象[这也就是反射存在的意义所在]
*/
public static void Test3() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> class1 = null;
class1 = Class.forName("com.android.reflect.Person");
//由于这里不能带参数,所以你要实例化的这个类Person,一定要有无参构造函数
Person person = (Person) class1.newInstance();
person.setAge(26);
person.setName("kaiven");
System.out.println("Test3: " + person.getName() + " : " + person.getAge());
} /**
* Demo4: 通过Java反射机制得到一个类的构造函数,并实现创建带参实例对象
*/
public static void Test4() throws ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class<?> class1 = null;
Person person1 = null;
Person person2 = null; class1 = Class.forName("com.android.reflect.Person");
//得到一系列构造函数集合
Constructor<?>[] constructors = class1.getConstructors(); try {
person1 = (Person) constructors[0].newInstance();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
person1.setAge(28);
person1.setName("zhuk"); person2 = (Person) constructors[1].newInstance(29, "zhuk"); System.out.println("Test4: " + person1.getName() + " : " + person1.getAge() + " , " + person2.getName() + " : " + person2.getAge()); } /**
* Demo5: 通过Java反射机制操作成员变量, set 和 get
*/
public static void Test5() throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException, InstantiationException, ClassNotFoundException {
Class<?> class1 = null;
class1 = Class.forName("com.android.reflect.Person");
Object obj = class1.newInstance(); Field nameField = class1.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(obj, "cyy"); System.out.println("Test5: 修改属性之后得到属性变量的值:" + nameField.get(obj)); } /**
* Demo6: 通过Java反射机制得到类的一些属性: 继承的接口,父类,函数信息,成员信息,类型等
*/
public static void Test6() throws ClassNotFoundException {
Class<?> class1 = null;
class1 = Class.forName("com.android.reflect.Person"); //取得父类名称
Class<?> superClass = class1.getSuperclass();
System.out.println("Test6: SuperMan类的父类名: " + superClass.getName()); System.out.println("==============================================="); Field[] fields = class1.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
System.out.println("类中的成员: " + fields[i]);
}
System.out.println("==============================================="); //取得类方法
Method[] methods = class1.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println("Test6,取得SuperMan类的方法:");
System.out.println("函数名:" + methods[i].getName());
System.out.println("函数返回类型:" + methods[i].getReturnType());
System.out.println("函数访问修饰符:" + Modifier.toString(methods[i].getModifiers()));
System.out.println("函数代码写法: " + methods[i]);
} System.out.println("==============================================="); Class<?> interfaces[] = class1.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
System.out.println("实现的接口类名: " + interfaces[i].getName());
} } /**
* Demo7: 通过Java反射机制调用类方法
*/
public static void Test7() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> class1 = null;
class1 = Class.forName("com.android.reflect.SuperPerson"); System.out.println("Test7: \n调用无参方法fly():");
Method method = class1.getMethod("fly");
method.invoke(class1.newInstance()); System.out.println("调用有参方法smoke(int m):");
method = class1.getMethod("smoke", int.class);
method.invoke(class1.newInstance(), 100);
} /**
* Demo8: 通过Java反射机制得到类加载器信息
* <p/>
* 在java中有三种类类加载器。
* <p/>
* 1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。
* <p/>
* 2)Extension ClassLoader 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类
* <p/>
* 3)AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。
*
* @throws ClassNotFoundException
*/
public static void Test8() throws ClassNotFoundException {
Class<?> class1 = null;
class1 = Class.forName("com.android.reflect.SuperPerson");
String name = class1.getClassLoader().getClass().getName(); System.out.println("Test8: 类加载器类名: " + name);
}
} 运行结果: 01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test1: 包名: com.tuba.yuanyc.audiomanagerdemo,完整类名: com.tuba.yuanyc.audiomanagerdemo.Person
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test2:(写法1) 包名: com.android.reflect,完整类名: com.tuba.yuanyc.audiomanagerdemo.Person
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test2:(写法2) 包名: com.android.reflect,完整类名: com.tuba.yuanyc.audiomanagerdemo.Person
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test3: zhuk : 26
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test4: yyc : 28 , yyc : 29
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test5: 修改属性之后得到属性变量的值:cyy
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test6: SuperMan类的父类名: java.lang.Object
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 类中的成员: private java.lang.String com.tuba.yuanyc.audiomanagerdemo.Person.name
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 类中的成员: private int com.android.reflect.Person.age
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test6,取得SuperMan类的方法:
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数名:getAge
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数返回类型:int
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数访问修饰符:public
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数代码写法: public int com.tuba.yuanyc.audiomanagerdemo.Person.getAge()
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test6,取得SuperMan类的方法:
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数名:getName
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数返回类型:class java.lang.String
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数访问修饰符:public
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数代码写法: public java.lang.String com.tuba.yuanyc.audiomanagerdemo.Person.getName()
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test6,取得SuperMan类的方法:
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数名:setAge
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数返回类型:void
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数访问修饰符:public
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数代码写法: public void com.tuba.yuanyc.audiomanagerdemo.Person.setAge(int)
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test6,取得SuperMan类的方法:
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数名:setName
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数返回类型:void
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数访问修饰符:public
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 函数代码写法: public void com.tuba.yuanyc.audiomanagerdemo.Person.setName(java.lang.String)
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test7:
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 调用无参方法fly():
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 走你~~
01-28 17:19:29.463 14972-14972/? I/System.out﹕ 调用有参方法smoke(int m):
01-28 17:19:29.463 14972-14972/? I/System.out﹕ ===============================================
01-28 17:19:29.463 14972-14972/? I/System.out﹕ Test8: 类加载器类名: dalvik.system.PathClassLoader
01-28 17:19:29.463 14972-14972/? I/System.out﹕ =============================================== 利用反射使用系统隐藏类 因为SystemProperties.java类已被系统隐藏,因此我们通过Java反射机制获取该类内容,通过get和set方法来读取、设置build.prop里面的内容。 package com.android.kaiven.tools; import android.content.Context;
import android.util.Log; import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method; import dalvik.system.DexFile; /**
* Created by zhangqing on 2017/3/1.
*/
public class SystemPropertiesProxy {
public static final String TAG = "SystemPropertiesProxy"; /**
* 根据给定的Key返回String类型的值
*
* @param context 上下文
* @param key 获取指定信息所需的key
* @return 返回一个String类型的值,如果不存在该key则返回空字符串
*/
public static String getString(Context context, String key) {
String result = "";
try {
ClassLoader classLoader = context.getClassLoader();
@SuppressWarnings("rawtypes")
Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
//参数类型
@SuppressWarnings("rawtypes")
Class[] paramTypes = new Class[1];
paramTypes[0] = String.class;
Method getString = SystemProperties.getMethod("get", paramTypes);
//参数
Object[] params = new Object[1];
params[0] = new String(key); result = (String) getString.invoke(SystemProperties, params);
} catch (IllegalArgumentException e) {
//e.printStackTrace();
//如果key超过32个字符则抛出该异常
Log.w(TAG, "key超过32个字符");
} catch (Exception e) {
result = "";
}
return result;
} /**
* 根据给定的Key返回String类型的值
*
* @param context 上下文
* @param key 获取指定信息所需的key
* @param def key不存在时的默认值
* @return 返回一个String类型的值,如果key不存在, 并且如果def不为null则返回def,否则返回空字符串
*/
public static String getString(Context context, String key, String def) {
String result = def;
try {
ClassLoader classLoader = context.getClassLoader();
@SuppressWarnings("rawtypes")
Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
//参数类型
@SuppressWarnings("rawtypes")
Class[] paramTypes = new Class[2];
paramTypes[0] = String.class;
paramTypes[1] = String.class;
Method getString = SystemProperties.getMethod("get", paramTypes);
//参数
Object[] params = new Object[2];
params[0] = new String(key);
params[1] = new String(def); result = (String) getString.invoke(SystemProperties, params);
} catch (IllegalArgumentException e) {
//e.printStackTrace();
//如果key超过32个字符则抛出该异常
Log.w(TAG, "key超过32个字符");
} catch (Exception e) {
result = def;
}
return result;
} /**
* 根据给定的key返回int类型的值
*
* @param context 上下文
* @param key 要查询的key
* @param def 默认返回值
* @return 返回一个int类型的值,如果没有发现则返回默认值 def
*/
public static Integer getInt(Context context, String key, int def) {
Integer result = def;
try {
ClassLoader classLoader = context.getClassLoader();
@SuppressWarnings("rawtypes")
Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
//参数类型
@SuppressWarnings("rawtypes")
Class[] paramTypes = new Class[2];
paramTypes[0] = String.class;
paramTypes[1] = int.class;
Method getInt = SystemProperties.getMethod("getInt", paramTypes);
//参数
Object[] params = new Object[2];
params[0] = new String(key);
params[1] = new Integer(def);
result = (Integer) getInt.invoke(SystemProperties, params);
} catch (IllegalArgumentException e) {
//e.printStackTrace();
//如果key超过32个字符则抛出该异常
Log.w(TAG, "key超过32个字符");
} catch (Exception e) {
result = def;
}
return result;
} /**
* 根据给定的key返回long类型的值
*
* @param context 上下文
* @param key 要查询的key
* @param def 默认返回值
* @return 返回一个long类型的值,如果没有发现则返回默认值def
*/
public static Long getLong(Context context, String key, long def) {
Long result = def;
try {
ClassLoader classLoader = context.getClassLoader();
@SuppressWarnings("rawtypes")
Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
//参数类型
@SuppressWarnings("rawtypes")
Class[] paramTypes = new Class[2];
paramTypes[0] = String.class;
paramTypes[1] = long.class;
Method getLong = SystemProperties.getMethod("getLong", paramTypes);
//参数
Object[] params = new Object[2];
params[0] = new String(key);
params[1] = new Long(def);
result = (Long) getLong.invoke(SystemProperties, params);
} catch (IllegalArgumentException e) {
//e.printStackTrace();
//如果key超过32个字符则抛出该异常
Log.w(TAG, "key超过32个字符");
} catch (Exception e) {
result = def;
}
return result;
} /**
* 根据给定的key返回boolean类型的值
* 如果值为'n','no','0','false' or 'off'返回false
* 如果值为'y','yes','1','true' or 'on'返回true
* 如果key不存在, 或者是其它的值, 则返回默认值
*
* @param context 上下文
* @param key 要查询的key
* @param def 默认返回值
* @return 返回一个boolean类型的值,如果没有发现则返回默认值def
*/
public static Boolean getBoolean(Context context, String key, boolean def) {
Boolean result = def;
try {
ClassLoader classLoader = context.getClassLoader();
@SuppressWarnings("rawtypes")
Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
//参数类型
@SuppressWarnings("rawtypes")
Class[] paramTypes = new Class[2];
paramTypes[0] = String.class;
paramTypes[1] = boolean.class;
Method getBoolean = SystemProperties.getMethod("getBoolean", paramTypes);
//参数
Object[] params = new Object[2];
params[0] = new String(key);
params[1] = new Boolean(def);
result = (Boolean) getBoolean.invoke(SystemProperties, params);
} catch (IllegalArgumentException e) {
//e.printStackTrace();
//如果key超过32个字符则抛出该异常
Log.w(TAG, "key超过32个字符");
} catch (Exception e) {
result = def;
}
return result;
} /**
* 根据给定的key和值设置属性, 该方法需要特定的权限才能操作.
*
* @param context 上下文
* @param key 设置属性的key
* @param val 设置属性的value
*/
public static void set(Context context, String key, String val) {
try {
@SuppressWarnings("rawtypes")
DexFile df = new DexFile(new File("/system/app/Settings.apk"));
ClassLoader classLoader = context.getClassLoader();
@SuppressWarnings("rawtypes")
Class SystemProperties = Class.forName("android.os.SystemProperties");
//参数类型
@SuppressWarnings("rawtypes")
Class[] paramTypes = new Class[2];
paramTypes[0] = String.class;
paramTypes[1] = String.class;
Method set = SystemProperties.getMethod("set", paramTypes);
//参数
Object[] params = new Object[2];
params[0] = new String(key);
params[1] = new String(val);
set.invoke(SystemProperties, params);
} catch (IllegalArgumentException e) {
//e.printStackTrace();
//如果key超过32个字符或者value超过92个字符则抛出该异常
Log.w(TAG, "key超过32个字符或者value超过92个字符");
} catch (Exception e) {
e.printStackTrace();
}
}
} 相关文章:https://www.jianshu.com/p/6277c1f9f48d 参考文献 http://www.cnblogs.com/mengdd/archive/2013/01/26/2877972.html
http://developer.android.com/intl/zh-cn/reference/java/lang/Class.html
http://blog.csdn.net/ljphhj/article/details/12858767
http://blog.sina.com.cn/s/blog_59ca2c2a0100gqdn.html

Android反射机制:手把手教你实现反射的更多相关文章

  1. Android开发之手把手教你写ButterKnife框架(三)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...

  2. Android开发之手把手教你写ButterKnife框架(二)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开 ...

  3. Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  4. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  5. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  6. Android开发之手把手教你写ButterKnife框架(一)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52662376 本文出自:[余志强的博客] 一.概述 JakeWhar ...

  7. Android 自定义ViewGroup手把手教你实现ArcMenu

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这样的UI效果,感觉很不错,后来知道github上有这 ...

  8. 转 Android 多线程:手把手教你使用AsyncTask

    转自:https://www.jianshu.com/p/ee1342fcf5e7 前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread类 实现Runnable接口 ...

  9. 小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

    前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代 ...

随机推荐

  1. 宝塔面板快速开启https服务

    最近在做小程序开发,急需要一个https的域名,首先我的域名是阿里云的,服务器是腾讯云的,操作都一样: 无论阿里云还是腾讯云,配置SSL是针对服务器的,所以首先是要去申请 腾讯/阿里云服务器的SSL( ...

  2. 分布式锁的实现(java)

    当对接第三方接口时,往往会碰到同一时间发送了大量相同的请求,这个时候或许就是第三方发送接口的失误了.而我们需要做的就是针对这个情况来强化我们的系统.这个时候就需要用到分布式锁.让这些请求只有一个能发送 ...

  3. 解决“The remote certificate is invalid according to the validation procedure”问题

    在用HttpClient发起https请求时,遭遇了“The remote certificate is invalid according to the validation procedure”异 ...

  4. RSA算法原理与加密解密 求私钥等价求求模反元素 等价于分解出2个质数 (r*X+1)%[(p-1)(q-1)]=0

    Rsapaper.pdf http://people.csail.mit.edu/rivest/Rsapaper.pdf [概述Abstract 1.将字符串按照双方约定的规则转化为小于n的正整数m, ...

  5. MySQL :: MySQL 8.0 Reference Manual :: B.6.4.3 Problems with NULL Values https://dev.mysql.com/doc/refman/8.0/en/problems-with-null.html

    MySQL :: MySQL 8.0 Reference Manual :: B.6.4.3 Problems with NULL Values https://dev.mysql.com/doc/r ...

  6. mysql 数据操作 单表查询 having 过滤

    SELECT 字段1,字段2... FROM 库名.表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 1.首先找到表 库.表 ...

  7. centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课

    centos  Linux系统日常管理2  tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...

  8. OpenStack功能简介

    为什要用云? 一.简单的说就是对资源更加合理的分配,使用,比如硬件的数量,带宽等等这些,因为你不能机器买来不需要了再卖掉(当然也可以),带宽跟机房签合同得来一年的,中间不够了也不能加,超了也不退钱 二 ...

  9. POJ3352Road Construction(构造双连通图)sdut2506完美网络

    构造双连通图:一个有桥的连通图,如何把它通过加边变成边双连通图? 一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥,然后删除这些桥边,剩下的每个连通块都是一个双连通子图.把每个 ...

  10. PAT 1090 Highest Price in Supply Chain[较简单]

    1090 Highest Price in Supply Chain(25 分) A supply chain is a network of retailers(零售商), distributors ...