java中获取class对象的方式
java中获取class对象的方式有四种:
Class Student{}
public Class Test1{
public static void main(String[] args) {
// 1.通过类名.class获取calss对象
Class c1 = Student.class;
// 2.通过对象名.getClass()方法
Student stu = new Student();
Class c2 = stu.getClass();
// 3.通过Class类中的forName() Class.forName():()中参数必须时一个类的全类名的字符串形式
try {
Class c3 = Class.forName("com.hisoft.java.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 4.通过类加载器.调用loadClass()方法
try {
Class c4 = ClassLoader.getSystemClassLoader().loadClass("com.hisoft.java.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class对象的作用
Class s=Student.class;
System.out.println(s.getName());//获得类的名称,包括包名
System.out.println(s.getSimpleName());//获得类的名称,不包括包名
Class c=s.getSuperclass();//获得本类的父类的class对象
Class[]arr=s.getInterfaces();//获得本类所实现的所有接口
Method[] meth1 = s.getDeclaredMethods();
//取得所有当前类声明的方法,包括四种访问权限的,但是不包括继承的方法
Method[] meth2 = s.getMethods();
//取得所有public的方法,包括继承的,接口中声明的和自己定义的
Field[] fi1 = s.getDeclaredFields();
//取得所有当前类自己定义的属性,包括四种访问权限的
Field[] fi2 = s.getFields();
//取得所有public的属性,包括继承的,接口中声明的和自己定义的
使用class对象创建类的对象
Object newInstance() 可以实例化对象
Class c = Class.forName("com.hisoft.java.Student");
Student stu = (Student)c.newInstance();
//这里的stu就是Student类的一个具体对象(这里会抛出异常)
反射包
一、通过Class对象获得Field对象及Field类的方法
Field:字段类,可以表示所有的字段。
Field getDeclaredField(String name)
Field getField(String name)
Field[] getDeclaredFields()
Field[] getFields()
Class c = Student.class;
Field f = c.getDeclaredField("name");
//根据括号内的字段名获取本类中声明的相应的字段对象(属性)
//字段的对象.getModifiers():返回的是字段的修饰符,该修饰符的值是多个修饰符的和的值(具体见下表)
System.out.println(f.getModifiers());
System.out.println(f.getName());//获取字段名
System.out.println(f.getType());//获取字段类型(如String)
Field f1 = c.getField("name");
//根据字段名获取用public修饰的字段,包括本类中,父类中以及接口中的public修饰的
Student stu = (Student)c.newInstance();//实例化
name.set(stu, "张三");
//set():可以通过字段对象.set(obj,value)方法给指定对象的字段进行赋值
System.out.println(name.get(stu));
//get(stu):可以通过字段对象.get()获取字段所对应对象字段的值
Field gender = c.getDeclaredField("gender");//这里的gender是用private修饰的
//setAccessible:如果字段的访问控制符为private则不能直接使用set赋值,则可以
通过调用setAccessible方法,设置该字段可访问
gender.setAccessible(true);
gender.set(stu,"男");
System.out.println(gender.get(stu));
二、通过Class对象获得Method对象及Method类的方法
public Method[] getDeclaredMethods()
public Method[] getMethods()
public Method getMethod(String name, Class<?>… parameterTypes)
public Method getDeclaredMethod(String name,Class<?>… parameterTypes)
Class c = Class.forName("com.hisoft.java.Student");
Method m1 = c.getDeclaredMethod("study", int.class,String.class);
//根据方法名以及参数类型获取一个指定的方法对象
System.out.println(m1.getModifiers());//获取修饰符
System.out.println(m1.getName());//获取方法名
System.out.println(m1.getReturnType());// 获取返回值类型
System.out.println(m1.getParameterCount());//获取方法中的参数列表个数
Parameter[] array = m1.getParameters();//获取方法中的参数列表
for(Parameter p:array) {
System.out.println(p);
}
m1.setAccessible(true);//设置方法的可访问
Student stu = (Student)c.newInstance();
//invoke:调用方法,方法对象.invoke(对象,参数列表)
m1.invoke(stu, 12,"张三");
Method run = c.getDeclaredMethod("run", int.class,String.class);
String str = (String) run.invoke(stu,12,"张三");
System.out.println(str);
三、通过Class对象获得Constructor对象
Constructor<?>[] getConstructors() 取得public的构造函数
Constructor<?>[] getDeclaredConstructors() 取得所有的构造函数
Constructor getConstructor(Class<?>… parameters)
Constructor getDeclaredConstructor(Class<?>… parameters)
Class c = Student.class;
Constructor[] carray = c.getDeclaredConstructors();
Constructor[] carray1 = c.getConstructors();
//getConstructor:根据参数列表获取指定的public修饰的构造方法
Constructor c2 = c.getConstructor(String.class,int.class);
Constructor c3 = c.getDeclaredConstructor(String.class,int.class,String.class,String.class);
//获取构造方法后可以获取相应的修饰符,构造方法名以及参数个数,类型以及参数列表
System.out.println(c3.getModifiers());
System.out.println(c3.getName());
System.out.println(c3.getParameterCount());
System.out.println(c3.getParameters());
System.out.println(c3.getParameterTypes());
// 根据构造方法实例化对象
Student stu = (Student)c3.newInstance("李四",20,"男","河南郑州");
System.out.println(stu);