个人学习记录
Person类:
package JavaReflect; public class Person{ private String name; private int age; private double hight; private String sex; // 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 double getHight() { // return hight; // } // // public void setHight(double hight) { // this.hight = hight; // } // // public String getSex() { // return sex; // } // // public void setSex(String sex) { // this.sex = sex; // } private Person(String name){ this.name = name; } private Person(String name,String sex){ this.sex = sex; this.name = name; } private Person(int age){ this.age = age; } private Person(){} public Person(String name,String sex,int age){ this.name = name; this.age = age; this.sex = sex; } private void canSing(){ System.out.println("人应该学学唱歌"); } }
反射实现类:
package JavaReflect; import java.lang.reflect.*; public class JavaReflect { //由于反射中有很多方法都会抛出异常,故需要在main方法中抛出,或者直接把main方法中所有代码放进try块里即可 public static void main(String[] args)throws ClassNotFoundException, InstantiationException,IllegalAccessException,NoSuchMethodException, InvocationTargetException,NoSuchFieldException{ /** * 当构造函数为private时,只能通过反射机制来实例化对象 * 下面为反射机制获取私有化构造函数 */ //必须指定具体路径及包名加类名 Class clazz = Class.forName("JavaReflect.Person"); Constructor<Person>[] constructors = clazz.getDeclaredConstructors();//获取所有构造方法,返回值默认是object,需要强制类型转换 //Constructor[] constructors1 = clazz.getConstructors();//仅获取公有构造方法 for(int i = 0;i<constructors.length;i++){ int k = i+1; Constructor<Person> contemp = constructors[i]; /** * 得到私有访问权限,这一步是访问私有化方法的关键一步,有了这一步,才可以通过newinstance去新建对象 */ contemp.setAccessible(true); System.out.println("第"+k+"个私有构造函数名称:"+contemp); Type[] type = contemp.getGenericParameterTypes(); System.out.println("参数个数:"+type.length); if(type.length!=0){ for( int j=0;j<type.length;j++){ k = j+1; System.out.println("第"+k+"个参数类型为:"+type[j]); } }else { System.out.println("无构造参数"); } } //然后便可调用各个方法去创建对象了 Person p1 = constructors[0].newInstance("zhangsan","男",20); /** * 根据参数直接获取私有构造方法 */ Constructor constructor = clazz.getConstructor(String.class,String.class,int.class); /** * 借用上面clazz1直接获取Person类成员变量,若类中get,set方法缺失或者为私有方法,则只能通过此种方法去赋值 */ Field field = clazz.getDeclaredField("age"); field.setAccessible(true); //通过Field的set方法访问私有属性并赋值 field.setInt(p1,1); System.out.println(field.getInt(p1)); //也可以直接获取类的所有私有成员变量 Field[] fields = clazz.getDeclaredFields(); for(int i=0;i<fields.length;i++){ fields[i].setAccessible(true); fields[i].set(p1,1);//这里赋值类型必须相对应,即set方法第二个实参必须和fields[i]的实际成员的类型相对应,此处随便写了1. System.out.println(fields[i].get(p1)); } /** * 获取带参数方的非构造方法,同样可以一次性获得所有方法,并实现调用,此处略 */ Method method = clazz.getMethod("canSing"); method.invoke(p1); method.setAccessible(true); } }