文本浏览器

Java反射全面理解

发布者 : 管理员-Adler | 发布时间 : 2019-01-17 19:17:30
文章号 : 20 | 阅读量 : 81+1 | AAW值(?) : 0.00 (仅供参考)

更新

import java.lang.reflect.Method;
class 
Person {
    
private String name;
    private int 
age;
    private 
String msg="hello wrold";
    public 
String getName() {
        
return name;
    
}
    
public void setName(String name) {
        
this.name = name;
    
}
    
public int getAge() {
        
return age;
    
}
   
public void setAge(int age) {
        
this.age = age;
    
}
    
public Person() {
    }
    
private Person(String name) {
        
this.name = name;
        
System.out.println(name);
    
}
    
public void fun() {
        System.
out.println("fun");
    
}
    
public void fun(String name,int age) {
        System.
out.println("我叫"+name+",今年"+age+"");
    
}
}
public class Main {
    
public static void main(String[] args){
        
try {
            Class c = Person.
class;
            
Object o = c.newInstance()//创建一个实例给Object o
            
Method method = c.getMethod("fun"String.class, int.class);
            
method.invoke(o"tengj"10);
        
catch (Exception e) {
            e.printStackTrace()
;
        
}
    }
}

获取成员变量

publicclass ReflectDemo {
public static void main(String[] args){
try {
Class c = Class.forName("com.tengj.reflect.Person");
//获取成员变量
Field field = c.getDeclaredField("msg"); //因为msg变量是private的,所以不能用getField方法
Object o = c.newInstance();
field.setAccessible(true);//设置是否允许访问,因为该变量是private的,所以要手动设置允许访问,如果msgpublic的就不需要这行了。
Object msg = field.get(o);
System.out.println(msg);
catch (Exception e) {
e.printStackTrace();
}
}
}

要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运行时识别对象和类的信息,主要有2种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型信息;另一种是反射机制,它允许我们在运行时发现和使用类的信息。

1Class对象

  理解RTTIJava中的工作原理,首先需要知道类型信息在运行时是如何表示的,这是由Class对象来完成的,它包含了与类有关的信息。Class对象就是用来创建所有常规对象的,Java使用Class对象来执行RTTI,即使你正在执行的是类似类型转换这样的操作。

  每个类都会产生一个对应的Class对象,也就是保存在.class文件。所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。

public class 反射 {
    
public static void main (String[] args) {
        XYZ x = 
new XYZ();
        
//System.out.println(x);
    
}
}
class XYZ {
    
static{
        System.
out.println("静态块");
    
}
    
publicXYZ() {
        System.
out.println("构造成功");
    
}
    
public void NoDisplay() {
        System.
out.println("不会被显示");
    
}
}

运行结果:

静态块

构造成功






评论加载中...

+ 参与讨论