在面向对象的世界里,万事万物皆对象。
java语言中,静态的成员 普通数据类型 不是对象
类是对象,类是java.lang.Class的实例对象
第一种表示方式---> 实际在告诉我们任何一个类都有一个隐含的静态成员变量class
Class c1 = ClassName.class;
第二种表达方式,已经知道该类的对象通过getClass方法
Class c1 = ObjectName.getClass();
c1 表示了ClassName类的类类型(class type)
类也是对象,是Class类的实例对象
这个对象我们称为该类的类类型
一个类只可能是Class的一个实例对象
第三种方式
Class c1 = Class.forName("ClassName");
c1.newInstance();//该类中必须要有无参构造函数
无论是方法反射还是成员变量反射还是构造函数反射都需要获取类的信息。
1.获取类的信息
①Class c1 = ClassName.class;//知道类名
②Class c1 = obj.getClass();//知道对象
③Class c1 = Class.forName("ClassName");//知道类名,动态创建
ClassName className = (ClassName)c1.newInstance();
2.获取方法列表类类型 Method[] methods = *.getMethods();(public 继承的) or *.getDeclaredMethods();(自己定义的)
打印方法列表类类型:
按照 returnType methodName(dataType,dataType....)打印(这一步穿插在每一步之后)
3.获取方法的返回类类型 Class returnType = methods[i].getReturnType(); 获取
4.获取方法的参数列表类类型 Class[] paramTypes = methods[i].getParameterTypes();
1.如上
2.获取成员变量列表类类型 Field[] fields = *.getDeclaredFields();(自己定义的) getMethods();
打印成员变量列表类类型:
按照 DataType DataName(逐次打印)
3.获取变量的类类型 Class dataType = fields[i].getType() ;获取类型名 dataType.getName();
4.获取变量名 fields[i].getName();
1.如上
2.获取构造函数列表类类型 Constructor[] constructors = c1.getConstructors();
打印构造函数列表类类型:
3.获取构造函数名 Class constructorName = constructors[i].getName();
4.获取参数列表类类型 Class[] paramTypes = constructors[i].getParameterTypes();
编译时刻加载类是静态加载类,运行时刻加载类是动态加载类。
反射操作都是编译之后的操作
编译之后集合的泛型是去泛型化的
java中集合的泛型,是防止错误输入的。
如何获取一个方法,进行反射操作。
1.获取类的信息
2.获取方法 getMethod("MethodName",args[....]);有两种表示方式:
①getMethod("MethodName",new Class[]{DataType.class,DataType.class..........});
②getMethod("MethodName",DataType.class,DataType.class,DataType.class......);
3.利用*.invoke(objectName,new Objdect[]{stringData,intData,})进行反射调用,有两种表示方式:
①*.invoke(objectName,new Object[]{strngData,intData,.....});
②*.invoke(objectName,stringData,intData,.....);
通过下面的列子加深理解:
package studio.codeocean.java.feflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @ClassName ClassUtilCopy
* @Description TODO
* @author XingZhaohu [email protected]
* @date 2016年5月7日 上午9:28:43
*/
public class ClassUtilCopy {
/*打印类中方法信息*/
public static void printMethodMessage(Object obj){
//1.获取class 信息
Class c1 = obj.getClass();//利用第二种实例化Class对象的方法
//2.获取方法
/**
* getMethods()获取该类中所有的public 的方法,包含从父类继承而来的。
* getDeclaredMethods() 获取所有自己声明(创建)的方法
* getMethod("MethodName",args.....);//在java方法反射机制将会介绍。
*
* getName()打印该对象的名字? 每个对象都有getName() e.g: java.lang.String
* getSimpleName()打印不带包名的名称 e.g: String
*/
Method[] methods = c1.getDeclaredMethods();//利用第二种 实例化Class对象的方法。
for(int i = 0; i < methods.length; i++ ){
//3.获取方法返回类型的类类型 &//4.获取方法名
Class returnType = methods[i].getReturnType();
System.out.print(returnType.getName()+" "+methods[i].getName()+"(");
//5.获取参数类型
Class[] paramTypes = methods[i].getParameterTypes();
for(Class param : paramTypes){
System.out.print(param+",");
}
System.out.println(")");
}
}
/*打印类中成员变量的名称*/
public static void printFieldMessage(Object obj){
//1.获取class信息
Class c1 = obj.getClass();
/**
* getFields 获得所有的public 的变量,包括从父类继承下来的。
* getDeclared 自己定义的变量
*/
Field[] fields = c1.getDeclaredFields();
for(int j = 0; j < fields.length; j++ ){
//2.获取成员变量的类型
Class fieldsType = fields[j].getType();
String typeName = fieldsType.getName();
//3.获取成员变量的名称
String fieldsName = fields[j].getName();
System.out.println(typeName + " "+fieldsName);
}
}
/*打印类中构造函数的信息*/
public static void printConstructorMessage(Object obj){
//1.获取class信息
Class c1 = obj.getClass();
//2.获取构造函数名
Constructor[] constructors = c1.getDeclaredConstructors();
//3.获取参数类型
for(int i = 0; i < constructors.length; i++ ){
//获取构造函数名
String constructorName = constructors[i].getName();
System.out.println(constructorName+" (");
Class[] paramTypes = constructors[i].getParameterTypes();
for(Class param : paramTypes){
System.out.print(param.getName()+",");
}
System.out.println(")");
}
}
}
package studio.codeocean.java.feflection;
/**
* @ClassName ClassDemo
* @Description TODO
* @author XingZhaohu [email protected]
* @date 2016年5月6日 下午3:31:25
*/
public class ClassDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee s = new Employee(null, 0, 0, 0);
ClassUtil.printMethodMessage(s);
ClassUtil.printFieldMessage("hello");
System.out.println("打印构造函数列表:");
ClassUtil.printConstructMessage(s);
}
}
package studio.codeocean.java.feflection;
public class ClassName{
private String name;
private int age;
private String sex;
public ClassName(){
}
public ClassName(String s){
this.name = s;
}
public ClassName(String s, int age){
this.name = s;
this.age = age;
}
public ClassName(String s,int a,String ss){
this.name = s;
this.sex = ss;
this.age = a;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}