当前位置:编程学习 > JAVA >>

java反射学习--操作私有成员

反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分。在java语言中这是一个很重要的特性。

反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。


java中有一个类很特殊,就是Class类,很多朋友在写程序的时候有用过比如Hello.class来查看类型信息,大家就可以把它理解为封装了类的信息,很多解释说Class类没有构造器,其实是有的,只不过它的构造方法是private的(构造函数还有private的??有,这样是为了禁止开发者去自己创建Class类的实例)。


/*
     * Constructor. Only the Java Virtual Machine creates Class
     * objects.
     */


private Class() {}


Class类是由虚拟机创建的,不需要我们去显示创建。

好了,先看一个简单的反射例子:


[java]
import java.lang.reflect.Method; 
 
public class ShowMethod { 
 
    public static void main(String[] args) throws Exception { 
        Class<?> c = Class.forName("java.lang.Object"); 
         
        Method[] methods = c.getDeclaredMethods(); 
         
        for(Method method : methods){ 
            System.out.println(method); 
        } 
    } 

import java.lang.reflect.Method;

public class ShowMethod {

 public static void main(String[] args) throws Exception {
  Class<?> c = Class.forName("java.lang.Object");
  
  Method[] methods = c.getDeclaredMethods();
  
  for(Method method : methods){
   System.out.println(method);
  }
 }
}


输出:


[java]
private static native void java.lang.Object.registerNatives() 
public final native java.lang.Class java.lang.Object.getClass() 
public native int java.lang.Object.hashCode() 
public boolean java.lang.Object.equals(java.lang.Object) 
protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException 
public java.lang.String java.lang.Object.toString() 
public final native void java.lang.Object.notify() 
public final native void java.lang.Object.notifyAll() 
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException 
public final void java.lang.Object.wait() throws java.lang.InterruptedException 
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException 
protected void java.lang.Object.finalize() throws java.lang.Throwable 

private static native void java.lang.Object.registerNatives()
public final native java.lang.Class java.lang.Object.getClass()
public native int java.lang.Object.hashCode()
public boolean java.lang.Object.equals(java.lang.Object)
protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException
public java.lang.String java.lang.Object.toString()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
protected void java.lang.Object.finalize() throws java.lang.Throwable

 

 

 

这里注意:forName中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常。

当没有创建对象的时候,获取类类型的方法

 


Class<?> c = Class.forName("java.lang.String");
Class<?> c = String.class;

 

 

好了,看一个具体的案例吧,
描述一下这个案例的简单要实现的功能:
DataType.java类中提供几个私有的字段(未提供set和get方法),用另外一个类,修改这几个字段的值,.我们要实现的就是使用反射的方法来访问这些Fields 和Methods.


[java]
import java.util.List; 
 
public class DataType { 
 
    private int n; 
     
    private String str; 
     
    private String[] sArr; 
     
    private List<Integer> list; 
     
     
    public DataType(){} 
     
 
    public DataType(int n, String str, String[] arr, List<Integer> list) { 
        this.n = n; 
        this.str = str; 
        sArr = arr; 
        this.list = list; 
    } 
     
    public String toString(){ 
         
        StringBuilder sb = new StringBuilder(); 
        sb.append("int n=").append(this.n).append(" "); 
        sb.append("String str=").append(this.str).append(" "); 
         
        sb.append("String[] sArr="); 
        for(int i=0;i<sArr.length;i++){ 
            sb.append(sArr[i]).append(" "); 
        } 
         
        sb.append("List<Integer> list="); 
        for(int i=0;i<list.size();i++){ 
            sb.append(list.get(i)).append(" "); 
        } 
         
        return sb.toString(); 
    } 
 
 

import java.util.List;

public class DataType {

 private int n;
 
 private String str;
 
 private String[] sArr;
 
 private List<Integer> list;
 
 
 public DataType(){}
 

 public DataType(int n, String str, String[] arr, List<Integer> list) {
  this.n = n;
  this.str = str;
  sArr = arr;
  this.list = list;
 }
 
 public String toString(){
  
  StringBuilder sb = new StringBuilder();
  sb.append("int n=").append(this.n).append(" ")

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,