JAVA 学习笔记 - 反射机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 学习笔记 - 反射机制相关的知识,希望对你有一定的参考价值。

1.   JAVA反射机制的概念

技术分享

 

2. 怎样实例化一个 Class对象   

    Class.forName(包名.类名);

    对象.getClass();

    类.class;

   ============================代码===================================

   

package org.liys.getclass;
class Y{

};

public class GetClass02{



public static void main(String args[]){

Class<?> c1 = null;
Class<?> c2 = null;
Class<?> c3 = null;

//日常开发中常用的一种实例化形式
try{
c1 = Class.forName("org.liys.getclass.Y");
}catch(ClassNotFoundException e){}

c2 = new Y().getClass(); //通过object类中的方法实例化
c3 = Y.class; //通过类.class实例化
System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c3.getName());
}

}

 

3.Class类的使用

 用Class类的newInstance来替代掉一般的new操作。 

 不过需要保证的是,类的申明中,需要有无参构造函数。

  .....

  Class<?> c = null;

  c = Class.forName(包名.类名);

  类的实例化对象 =  (类) c.newInstatnce(); (object 向下转型)

  对象.setName(), 对象.setage();

  ......

  很少会用带有有参构造函数的类来做实例化,但如果有的话,可以用Constructor来解决。  

  使用getConstructors来获取该类所有的构造函数 cons[],并用下标来调用cons[0],cons[1]。

 

  ===========================代码=============================

  

package org.liys.newinstance;
import java.lang.reflect.Constructor;
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 String toString(){
return "姓名: " + this.name + " 年龄: "+ this.age;
}
}

public class GetPerson{

public static void main(String args[]){

Class<?> c = null;

try{
c = Class.forName("org.liys.newinstance.Person");
} catch(ClassNotFoundException e){
e.printStackTrace();
}
Person p = null;
Constructor<?> cons[] = null;
cons = c.getConstructors();
try{
p = (Person) cons[0].newInstance("李柯",30);
}catch(Exception e){
e.printStackTrace();
}
//p.setName("李柯");
//p.setAge(30);
System.out.println(p);


}


}

  

4.取得类(.class)的结构

   最重要是获取类的对象, Class<?> c1 = Class.forName(报名.类名);

   a. 获取类的父类   从java doc中查询 Class中获取父类的方法

      Class<?> c2 = c1.getSuperclass();     .....c2.getName();

      技术分享

 

   b.获取该类中所有的方法,包括方法的参数,抛出异常,返回值等

   通过Class中的getMethods()方法获得所有的方法包括从父类继承的方法

   或者通过Class中的getDeclaredMethods() 方法,只是获得该类中定义的方法。

   然后再根据Method类去查如何获得函数的参数,返回值,权限范围,抛出异常等

 

  技术分享

代码=========================================================================

package org.lxh.demo15;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class GetMethodDemo {
public static void main(String args[]){

Class<?> c1 = null;
try{
c1 = Class.forName("org.lxh.demo15.Person");  //获取类对象
}catch(ClassNotFoundException e){
e.printStackTrace();
}

Method[] m = c1.getMethods();   //获取类中所有的方法
String mod = null;
String parm = "";
String Except = "";
for(int i=0; i<m.length;i++){      
parm = "";
Except = "";
mod = Modifier.toString(m[i].getModifiers());  //获取方法的权限访问范围

Class<?> rettype = m[i].getReturnType();     //获取方法的返回值

Class<?>[] p = m[i].getParameterTypes();    //获取方法中的参数  
for(int j= 0;j<p.length;j++){

parm = parm + p[j].getName() +" arg["+j+"]";
if (j < (p.length -1)){
parm = parm + ",";
}

}


Class<?>[] Ex = m[i].getExceptionTypes();  //获取方法抛出的异常,一是Class类型
if (Ex.length > 0){
Except = " throws ";
for(int j= 0;j<Ex.length;j++){

Except = Except + Ex[j].getName() ;
if (j < (Ex.length -1)){
Except = Except + ",";
}

}
}

System.out.println(mod + " " +rettype+" "+ m[i].getName() +"("+parm+")" +" "+Except);

}

}

}

 

c.获取实现的接口类

........

Class<?> c[] = c1.getInterfaces() ; // 以数组形式返回实现的全部接口
for(int i=0;i<c.length;i++){
System.out.println("实现的接口名称:" + c[i].getName()) ; // 输出接口名称
}

........

 

d.获取类的属性

 

Field f[] = c1.getDeclaredFields() ; // 取得本类中的属性

Field f[] = c1.getFields() ; // 取得本类中的公共属性包括继承自父类或实现的接口类中的

 .......

Field f[] = c1.getFields() ; // 取得本类中的公共属性
for(int i=0;i<f.length;i++){
Class<?> r = f[i].getType() ; // 得到属性类型     
int mo = f[i].getModifiers() ; // 得到修饰符的数字
String priv = Modifier.toString(mo) ; // 还原修饰符

System.out.print(priv + " ") ;
System.out.print(r.getName() + " ") ; // 得到属性类型
System.out.print(f[i].getName()) ; // 输出属性名称
System.out.println(" ;") ;

}

..........

 

e.获取类的所有构造方法

Constructor<?> con[] = c1.getConstructors() ;

之后与Method相同,查找Constructor 的参数,访问权限范围。

   

 

 

   

 





































































































































以上是关于JAVA 学习笔记 - 反射机制的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

Java学习注解和反射超详细笔记

java反射学习笔记

Java学习笔记54(反射详解)

Java讲课笔记36:初探反射机制