java反射机制java反射机制
在正常的情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在java中也允许通过一个对象来找到其中所在的类的信息,这实际上就是class类的功能。 class People{
}
public class Demo1{
public static void main(String args[]){
People p=new People(); //实例化People的类的对象
System.out.println(people.getClass().getName()); //得到对象所在...
java反射机制
在正常的情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在java中也允许通过一个对象来找到其中所在的类的信息,这实际上就是class类的功能。 class People{
}
public class Demo1{
public static void main(String args[]){
People p=new People(); //实例化People的类的对象
System.out.println(people.getClass().getName()); //得到对象所在的类 }
}
上面的操作是反着来的,是通过通过对象得到所在的类。
Object类的支持
在Object类中定义了一下的
,此方法将被所有子类继承:
public final Class getClass();
注意上面的方法返回的类型是一个“class”类型,实际上此类是Java反射的源头,实际上所谓从程序的运行结果来看也很好理解,即:可以通过对象反射出类的名称。 正常方式
引入需要的“包.类”名称------》通过new实例化-------》取得实例化的对象 反射方式
实例化对象-------》通过getClass()方法------》得到完整的“包.类”名称 Class类
class本身表示一个类的本身,通过Class可以完整的得到一个类中的完整结构,包括此类中定义的方法,属性等等。
class类常用的方法
1.通过传入一个完整的“包.类”名称实例化Class对象
public static Class> forName(String className)throws ClassNotFoundException 2.得到一个类中的全部的构造方法
public Constructor
getConstructor()throwsNoSuchMethodException,SecurityException 3.得到本类和父类中的全部属性
public Field[] getDeclaredFields()throws SecurityException
4.得到本类中的全部属性
public Field[] getFields()throws SecurityException
5.得到类中的全部方法
public Method[] getMethods()throws SecurityException 6.返回一个Method 对象并设置一个方法中的多有参数类型
public Method getMethod(String name, Class... parameterTypes)
throws NoSuchMethodException, SecurityException 7.得到类中的全部接口
public Class[] getInterfaces()
8.得到类的名称(包.类)
public String getName()
9.得到类所在的包
public Package getPackage()10.得到该类的父类
public Class getSuperclass()
11.根据Class定义的类实例化对象 public T newInstance()throws InstantiationException, IllegalAccessException
12.得到数组类型的Class
public Class> getComponentType() 13.判断此class是不是一个数组
public boolean isArray()
实例化class类对象
实例化class类对象的方法有三种:
1.通过forName()方法
2. 类.class
3. 对象.getClass()
实例:
class People{
}
Public class PeopleDemo{
public static void main(String args[]){
Class> c1=null;
Class> c2=null;
Class> c3=null;
try{
// 第一种方式
c1 = Class.forName("com.wangxing.test.People") ;
}catch(ClassNotFoundException e){
e.printStackTrace() ;
}
//第二种方式
c2 = new People().getClass() ;
//第三种方式
c3 = People.class ;
// 得到类的名称
System.out.println("类名称:" + c1.getName()) ;
System.out.println("类名称:" + c2.getName()) ;
System.out.println("类名称:" + c3.getName()) ; }
}
Class的使用
class是反射的源头,不光可以获得对象所在类的信息,也可以直接通过class类的的方法
进行对象的实例化操作,正常的情况下,使用关键字new为对象实例化,如果现在已经实
例化好了class对象,则可以通过class类中提供的: public T newInstance()
throws InstantiationException,
IllegalAccessException 来实例化对象。
例如:
class Person{
private String name ; // name属性
private int 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 ;
}
// 覆写toString()方法
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
}
public class InstanceDemo01{
public static void main(String args[]){
Class> c = null ; // 声明Class对象
try{
c = Class.forName("com.wangxing.test.Person") ;
}catch(ClassNotFoundException e){
e.printStackTrace() ;
}
Person per = null ; // 声明Person对象
try{
per = (Person)c.newInstance() ; // 实例化对象
}catch(Exception e){
e.printStackTrace() ;
}
per.setName("杜飞强") ; // 设置姓名
per.setAge(24) ; // 设置年龄
System.out.println(per.toString()) ;// 内容输出,调用toString()
}
}
通过上面的代码可以发现,即使不使用new关键字也可以进行实例化,那就是反射。
但是,在使用以上操作的时候有一点必须注意,在操作中必须存在无参数的构造函数。否则无法实现实例化。
如果要通过指定的构造方法完成实例化,照以下步骤完成: 1.通过Class类中的getConstructors()方法取得本类中的全部的构造方法。 2.向构造方法中传递一个对象数组进去,里面包含了构造方法中所需的各个参数。 3.之后通过Constructor实例化对象
在Constructor类中存在一个方法
public T newInstance(Object... initargs)
throws InstantiationException, IllegalAccessException,
IllegalArgumentException,InvocationTargetException
传递初始化参数,以进行对象的实例化操作。
Constructor类的常用方法:
得到构造方法的修饰符
public int getModifiers()
得到构造方法的名称
public String getName()
得到构造方法中的参数类型
public Class>[] getParameterTypes()
返回构造方法的信息
public String toString()
明确调用有参数的构造方法,实例化对象:
class Person{
private String name ; // name属性
private int age ; // 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(){ // 覆写toString()方法
return "姓名:" + this.name + ",年龄:" + this.age ;
}
}
public class InstanceDemo03{
public static void main(String args[]){
Class> c = null ; // 声明Class对象
try{
c = Class.forName("com.wangxing.test.Person") ;
}catch(ClassNotFoundException e){
e.printStackTrace() ;
}
Person per = null ; // 声明Person对象
Constructor> cons[] = null ;
cons = c.getConstructors() ;
try{
// 实例化对象
per = (Person)cons[0].newInstance("杜飞强",24) ;
}catch(Exception e){
e.printStackTrace() ;
}
System.out.println(per.toString()) ;// 内容输出,调用toString()
}
}
最好能提供无参数构造方法。
本文档为【java反射机制】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。