import java.lang.reflect.*;
/*1、准确掌握获取类的结构
* 2、如何通过反射实例化对象
* 3、获取一个完整的方法 ,(锻炼逻辑思维) 了解即可
* 4、获取全部的属性
*/
public class ClassNoTypeReflection {
public static void main(String args[])throws Exception{
Class<?> a=null;
a=Class.forName("PersonOne"); //class类本身没有定义任何构造方法,去的实例通过Forname()静态方法取得Class实例,
//此操作代替了普通我们类里new关键词的操作方式
System.out.println(a.getName());
Constructor<?> cons[]=a.getConstructors(); //抽象获取PersonOne类的全部构造方法
for(Constructor<?> n:cons){ //Foreach 输出方式
System.out.println(n);
}
PersonOne one=(PersonOne)a.newInstance();//无参构造实例化PersonOne对象
one.setName("杨军"); //调用方法实现功能
one.sayName();
PersonOne two=(PersonOne)cons[1].newInstance("廖鸡毛",30);//有参实例PersonOne对象
//有参实例化对象原理,Constructor类内有newInstance(Object args...);
two.sayName();
two.sayAge();
//获取完整的方法
Method m[]=a.getMethods();
for(int i=0;i<m.length;i++){
int mm=m[i].getModifiers(); //取得方法的修饰符,因为此返回值为整数,整形赋值
Class<?> r=m[i].getReturnType();//获取方法的返回类型
System.out.print(Modifier.toString(mm)+" "+r.getName()+" "+m[i].getName()+" "+"(");
//Modifier.toString(mm) 将整形转为String 如 public r.getName()返回值 void or String
Class<?> types[]=m[i].getParameterTypes();
for(int j=0;j<types.length;j++){
System.out.print(types[j].getName()+" "+"arg"+j);
if(j<types.length-1){
System.out.print(","); //插入参数分隔符 ,循环判断 这种模式日后开发会经常用到
}
}
System.out.print(")"+"\n");
}
System.out.print("\n");
//获取全部完整的属性
Field field[]=a.getFields();
for(int k=0;k<field.length;k++){
int kk=field[k].getModifiers();
Class<?> r=field[k].getType();
System.out.println(Modifier.toString(kk)+" "+r+" "+field[k].getName());
}
}
}
PersonOne
public PersonOne()