java的反射机制
?
2、研究Class类?
Class类的构造方法被私有化了,外部无法直接看见,所以其内部必然有一个方法可以取得Class 实例。?
public static Class<?> forName(String className) throws ClassNotFoundException?
此方法可以返回Class类的实例,此方法接收一个完整的包.类名称。?
通过newInstance方法,可以将传入的完整的字符串(包.类名称)实例化。
package? ?? ???org.michael;? ??
import?java.lang.reflect.*;? ??
class?Person{? ??
? ?? ???private?String name;? ??
? ?? ???private?int?age;? ??
? ?? ???public?void?setName(String name){? ??
? ?? ?? ?? ?? ??this.name = name;? ??
? ?? ???}? ??
? ?? ???public?void?setAge(int?age){? ??
? ?? ?? ?? ?? ??this.age = age;? ??
? ?? ???}? ??
? ?? ???public?String getName(){? ??
? ?? ?? ?? ?? ??return?this.name;? ??
? ?? ???}? ??
? ?? ???public?int?getAge(){? ??
? ?? ?? ?? ?? ??return?this.age;? ??
? ?? ???}? ??
}? ??
public?class?Demo03{? ??
? ?? ???public?static?void?main(String args[]){? ??
? ?? ?? ?? ?? ? Person p =?null;? ??
? ?? ?? ?? ?? ? Class c =?null;? ??
? ?? ?? ?? ?? ??try{? ??
? ?? ?? ?? ?? ?? ?? ?? ?c = Class.forName("org.michael.Person");? ??
? ?? ?? ?? ?? ? }catch?(Exception e){}? ??
? ?? ?? ?? ?? ??try{? ??
? ?? ?? ?? ?? ?? ?? ?? ?p = (Person)c.newInstance();? ??
? ?? ?? ?? ?? ? }catch?(Exception e){}? ??
? ?? ?? ?? ?? ??//上面两行代码也可以使用下面一行代码取代哈~? ??
? ?? ?? ?? ?? ??// p = (Person)Class.forName("org.michael.Person").newInstance();? ??
? ?? ?? ?? ?? ? p.setName("Michael");? ??
? ?? ?? ?? ?? ? p.setAge(30);? ??
? ?? ?? ?? ?? ? System.out.println(p.getName()+"--->"+p.getAge());? ??
? ?? ???}? ??
}
如果要使用以上的代码去实例化一个对象,则必须有一个前题条件:在对象所在的类中必须有一个无参构造方法,如果没有此无参构造,则肯定会出现错误。
在此时如果想继续通过此操作为对象进行实例化,则可以通过构造方法类(Constructor)完成。
package? ?? ???org.michael;? ??
import?java.lang.reflect.*;? ??
class?Person{? ??
? ?? ???private?String name;? ??
? ?? ???private?int?age;? ??
? ?? ???public?Person(String name,int?age){? ??
? ?? ?? ?? ?? ??this.name = name;? ??
? ?? ?? ?? ?? ??this.age = age;? ??
? ?? ???}? ??
? ?? ???public?void?setName(String name){? ??
? ?? ?? ?? ?? ??this.name = name;? ??
? ?? ???}? ??
? ?? ???public?void?setAge(int?age){? ??
? ?? ?? ?? ?? ??this.age = age;? ??
? ?? ???}? ??
? ?? ???public?String getName(){? ??
? ?? ?? ?? ?? ??return?this.name;? ??
? ?? ???}? ??
? ?? ???public?int?getAge(){? ??
? ?? ?? ?? ?? ??return?this.age;? ??
? ?? ???}? ??
}? ??
public?class?Demo05{? ??
? ?? ???public?static?void?main(String args[]){? ??
? ?? ?? ?? ?? ? Person p =?null;? ??
? ?? ?? ?? ?? ? Class c =?null;? ??
? ?? ?? ?? ?? ??try{? ??
? ?? ?? ?? ?? ?? ?? ?? ?c = Class.forName("org.michael.Person");? ??
? ?? ?? ?? ?? ?? ?? ?? ?Constructor[] cs = c.getConstructors();? ??
? ?? ?? ?? ?? ?? ?? ?? ?Object obj[] =?new?Object[]{"Michael",30};? ??
? ?? ?? ?? ?? ?? ?? ?? ?//一个类中会有多个构造方法,所以此时返回一个数组? ??
? ?? ?? ?? ?? ?? ?? ?? ?p = (Person)cs[0].newInstance(obj);? ??
? ?? ?? ?? ?? ? }catch?(Exception e){? ??
? ?? ?? ?? ?? ?? ?? ?? ?System.out.println(e);? ??
? ?? ?? ?? ?? ? }? ??
? ?? ?? ?? ?? ? System.out.println(p.getName()+"--->"+p.getAge());? ??
? ?? ???}? ??
}
?