您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第15章:Java反射机制】_Class类的使用
发布时间:2021-01-06 15:57:35编辑:雪饮阅读()
用class类去实例化目标类
package org.kasumi;
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 String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
};
public class Hello{
public static void main(String args[]){
try{
Class<?> c = Class.forName("org.kasumi.Person");
Person per = (Person)c.newInstance();
per.setName("kasumi") ;
per.setAge(24) ;
System.out.println(per) ;
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(Exception e){
e.printStackTrace() ;
}
}
};
如果目标类中存在有参构造,则会实例化失败
package org.kasumi;
class Person{
private String name ;
private int age;
public Person(String name,int age){
this.setName(name) ;
this.setAge(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 String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
};
public class Hello{
public static void main(String args[]){
try{
Class<?> c = Class.forName("org.kasumi.Person");
Person per = (Person)c.newInstance();
per.setName("kasumi") ;
per.setAge(24) ;
System.out.println(per) ;
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(Exception e){
e.printStackTrace() ;
}
}
};
D:\>javac -d . Hello.java
D:\>java org.kasumi.Hello
java.lang.InstantiationException: org.kasumi.Person
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at org.kasumi.Hello.main(Hello.java:29)
因为系统因为显式声明了构造方法则只认显式构造,除非同时显式声明无参构造方法
package org.kasumi;
class Person{
private String name ;
private int age;
public Person(String name,int age){
this.setName(name) ;
this.setAge(age);
}
public Person(){}
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 String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
};
public class Hello{
public static void main(String args[]){
try{
Class<?> c = Class.forName("org.kasumi.Person");
Person per = (Person)c.newInstance();
per.setName("kasumi") ;
per.setAge(24) ;
System.out.println(per) ;
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(Exception e){
e.printStackTrace() ;
}
}
};
D:\>javac -d . Hello.java
D:\>java org.kasumi.Hello
姓名:kasumi,年龄:24
除了显式构造一个无参构造方法以外还可以在调用处显式指定调用某个构造(并非直接new有参构造)
package org.kasumi;
import java.lang.reflect.Constructor ;
class Person{
private String name ;
private int age;
public Person(String name,int age){
this.setName(name) ;
this.setAge(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 String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
};
public class Hello{
public static void main(String args[]){
try{
Class<?> c = Class.forName("org.kasumi.Person");
Constructor<?> cons[] = c.getConstructors() ;
Person per =(Person)cons[0].newInstance("kasumi",24);
System.out.println(per);
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(Exception e){
e.printStackTrace() ;
}
}
};
D:\>javac -d . Hello.java
D:\>java org.kasumi.Hello
姓名:kasumi,年龄:24
关键字词:java,反射,Class