---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
一、概述
在Java中非常重要的就是反射机制,在正常情况下如果有一个类,则肯定能够通过类创建对象;如果想要使用类的完整名称来创建对象的话,就需要用到Java的反射机制,Java反射机制的基石是Class类Class类表示所有类的本身【也就是一个类在内存中的字节码】,通过Class可以获取到一个类的完整结构,包括此类中的方法、属性、包名、类名等等...
Class类的常用方法:(注意Class类没有公开的构造方法【构造方法是私有的】)
静态方法:Class.forName("类的完整名称");通过此方法能够得到Class类的对象
Class类获取对象的3个基本方式:
1、对象.getClass()
2、类名.class
3、Class.forName("")
一般方法:
getConstructors()得到一个类的所有构造方法
getConstructor(Class...)得到指定的构造方法
getDeclaredFields()得到类中全部属性
getFields()得到类中继承来的或者本类中的public类型的字段
getMethods()得到类中的全部方法
getMethod(String Class)根据方法名称与参数类型获取类中的方法
getInterfaces()得到类所有实现的接口
getName()得到类的名称
getPackage()得到类的包名
getSupperClass()得到类的父类
newInstance()调用类的无参构造方法,实例化该类
getComponentType()返回表示数组类型的Class
isArray()是否数组
下面对各个方法做一个简要的介绍
package com.itheima.hightech;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectDemo1 {
public static void main(String[] args) throws Exception{
//1.得到Student类的所有构造方法
Class<Student> clazz = Student.class;
Constructor<?>[] cs = clazz.getConstructors();
for (Constructor<?> constructor : cs) {
System.out.println("这是全部构造方法的其中一个:"+constructor);
}
//2.得到Student类的有参数的构造方法
Constructor<?> c = clazz.getConstructor(int.class,String.class);
System.out.println("这是得到的指定的构造方法:"+c);
//3.得到Student类中的全部字段
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println("类中的字段:"+field);
}
//这个应该是得到类中继承来的或者本类中的public类型的字段
Field[] fields2 = clazz.getFields();
for (Field field : fields2) {
System.out.println("继承来的或者本类中的public类型字段:"+field);
}
//得到Student类中的全部方法,包括父类中的非私有的方法
Method[] ms = clazz.getMethods();
for (Method method : ms) {
System.out.println("全部方法:"+method);
}
//得到Student类中的指定的方法sayAge()
Method m = clazz.getMethod("sayAge");
System.out.println("指定方法:"+m);
//得到Student类实现的全部接口,不包括父类实现的接口
Class<?>[] cls = clazz.getInterfaces();
for (Class<?> cl : cls) {
System.out.println("全部接口:"+cl);
}
//得到类的名称
System.out.println(clazz.getName());
//得到包的名称
System.out.println(clazz.getPackage());
//得到类的父类
System.out.println(clazz.getSuper