https://www.cnblogs.com/ysocean/p/6516248.html
动态语言:动态类型语言,是指数据类型的检查是在运行时做的。用动态类型语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部记录数据类型。Perl,Python,Ruby
静态类型:是指数据类型的检查是在运行前(如编译阶段)做的。C++,Java,C#
但同时:java因为他的反射机制被视为准动态语言:
- 对于任意一个类,都能够知道这个类的所有属性和方法
- 对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性
代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗!
1.获取Class类的三种方式
对象.getclass
类.class (静态成员变量)
Class.forname(“完整类名”)
2. Class类获取到之后 有什么用(API)
https://blog.csdn.net/qq_32165041/article/details/82709260
Field( java.lang.reflect.Field)
Method(java.lang.reflect.Method)
3.根据反射获取父类的private方法
package p1_reflect.pp2_getBasePrivate;
import java.lang.reflect.Field;
public class Test_getFatherPrivate {
public static Field getDeclaredField(Object obj,String fieldName){
Field field=null;
Class c = obj.getClass();
for(;c!=Object.class;c=c.getSuperclass()){
try{
field=c.getDeclaredField(fieldName);
field.setAccessible(true);
return field;
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
return field;
}
public static Object getFieldValue(Object object,String fieldName) throws IllegalAccessException {
Field field = getDeclaredField(object, fieldName);
return field.get(object);
}
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class c1 = Class.forName("p1_reflect.pp2_getBasePrivate.Son");
System.out.println(getFieldValue(c1.newInstance(),"privateString"));
}
}
4. 补充
反射破坏代码的封装性,破坏原有的访问修饰符访问限制