黑马程序员-反射-.class-Class.forName()-object.getClass()-Constructor-Field
来源:互联网 发布:淘宝产品增加人气 编辑:程序博客网 时间:2024/05/16 19:28
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
反射
Class 类:反射的基石
反射就是将java类中的各种成分映射成相应的java类。
java程序中的各个java类,可以描述为同一类事物,用Class类来表示。
换句话说:Class类是全部java类的抽象,无论是JDK中的,还是自定义的类。
void,数组,java基本数据类型也都表示为Class对象。
特性:
Class类没有公共构造方法,Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的。
1. Class cls1 = 类名.class;
2. Class cls2 = 对象引用(或对象).getClass();
3. Class cls3 = Class.forName(“类名称”);
常用方法:
1. Object.getClass():返回此Object的运行时类。
2. isPrimitive():判定指定的Class对象,是否指定一个基本数据类型。
3. Class.forName(String className)
返回 字符串指定的类或接口相关连的Class对象。
返回字节码文件(.class文件)两种方式:
1. 已加载过得类,放在java虚拟机中。
2. 没有加载过,类加载器加载到虚拟机中。
得到各个 字节码 对应的 实例对象(Class类型)。
1. 类名.class (如:System.class)
2. 对象.getClass() (如:new Data().getClass)
3. Class.forName(“类名”) (如:Class.forName(“java.lang.Thread”) )
forNmae(“类名”),将实例化该类
getConstructor()
Constructor strConst = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
获得具体的构造方法时,要传递类型
Constructor类
String str = (String)strConst.newInstance(new StringBuffer("abc"));
调用获得的方法来构造对象时,要用到相同类型的实例对象。
getField()
1. 非private成员
① 通过反射访问成员变量时,通过Class类的getField(“成员变量名称”)方法,得到Field对象。
② 再将被访问的对象,传递给Field对象,即可得到该值了。
2. private成员
① 使用Class类的getDeclaredField(),该方法可以返回全部声明过的字段。
② 使用Field类的父类AccessibleObject的setAccessible(boolean flag)方法将私有变量设置成为可访问的变量。
getMethod()
public Method getMethod(String name, Class<T>... parameterTypes )
name : 方法名
parameter Types : 参数列表
Method类
invoke()方法:
public Object invoke(Object obj , Object...arg / Object[]...args)
参数:
1. obj : 从这个对象中调用底层方法。
① 如果底层方法是静态的,则可以忽略obj参数,该参数可以为null。
② 如果底层方法是静态,并且尚未初始化声明此方法的类,则会将其初始化
2. args : 参数列表。 * 如果底层方法所需的形参个数为0,则所提供的args长度,可以为0或null。
public static void myGetMethod() throws Exception {
String str = "123";
Method charAtMethod = String.class.getMethod("charAt", int.class);
System.out.println(charAtMethod.invoke(str,1));
System.out.println(charAtMethod.invoke(str, new Object[]{2}));
}
对接收数组方式的成员方法反射
在A类的main方法中,调用B类的main方法,并且传递字符串参数给B的main方法:
注意:
1. 需要给A的main的参数列表args[0]复制,B类的名称。
2. main方法是static的,则可以忽略该对象参数,而只传递null。
数组:
Class类:
每个数组属于被映射为Class对象的一个类,所有具有相同类型及维度的数组 都共享该Class类。
getName():
public String getName()
以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
1. 当类对象表示一个数组类型:
① 其名字为:
表示该数组嵌套的一个或多个”[”字符加元素类型名。
2. 当类对象表示一个非数组类型的引用类型:
3. 当类对象表示一个基本数据类型或void:
① 返回该类的二进制名称
getSuperclass()
public Class<? super T> getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
java.lang.Object
java.lang.Object
true
Arrays类
asList方法
public static <T> List<T> asList(T... a)
说明:JDK1.4asList方法,其参数支持Object[]数组。所以传递的是Object数组,则其可以直接解析,非Object的参数,则返回其对应的getName()方法返回的数组的名称。
结果为:
[[I@dc8569]
[a, b, c]
需求:
使用反射,遍历类的数组。
Class类 --> isArray()
boolean isArray()
判定此 Class 对象是否表示一个数组类。
Array类 --> getLength(Object obj)
static int getLength(Object array)
以 int 形式返回指定数组对象的长度。
Array类 --> get(Object array, int index)
static Object get(Object array, int index)
返回指定数组对象中索引组件的值。
框架
框架的思想
框架就是开发商改好的毛坯房,自己写的类就像后来根据门框大小,木桶标准等等自己安装的家具门窗。自己写的类是为框架服务的。
与工具类的区别
工具类是为自己写的类服务的,而自己写的类是为框架服务的。
代码:
config.properties
className=java.util.HashSet
- 黑马程序员-反射-.class-Class.forName()-object.getClass()-Constructor-Field
- 黑马程序员---初识反射,Class,Constructor,Field
- 黑马程序员---反射(Class类、Constructor类、Field类)
- 黑马程序员——反射——Class、Constructor、Field、Method及简单框架原理
- 黑马程序员——Java基础---反射Class类、Constructor类、Field类
- 黑马程序员——Java基础---反射Class类、Constructor类、Field类
- Java 反射机制 .class .getClass() Class.forName("") .TYPE int void
- .getClass()、.class、.forName()
- Java反射之Class,Constructor,Field
- Java反射机制--Class,Field,Method,Constructor
- 反射Class类、Constructor类、Field类
- 黑马程序员------反射技术Constructor,Field,Method
- class&constructor&method&field
- 黑马程序员------反射的深入学习(No.1)(Class类、Constructor类、Field类、Method类、数组的反射)
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 【View】Android View绘制机制
- 使用bloomfilter
- JVM第三天 Java Class File structure
- weblogic中间件启动慢,控制台登陆打开网页慢问题解决方法,已验证可解决哦
- ITIL总结
- 黑马程序员-反射-.class-Class.forName()-object.getClass()-Constructor-Field
- matlab矩阵中每一行数除以一个数
- poj 3278 Catch That Cow
- 学习笔记-NODE.JS, EXPRESS, JADE, AND MONGODB
- 23种设计模式详解
- iOS 纯代码适配iPhone6,6+
- JVM Specification 第二天(Frame)
- Android应用程序的签名
- mongo的表添加字段,并赋值保存