Java教程

Java反射

本文主要是介绍Java反射,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

       Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;这种动态获取信息以 及动态调整对象方法的功能称为 java 语言的反射机制。

package top.hkf.hblog;
 
import java.lang.reflect.Field;
import java.lang.reflect.Method;
 
public class ReflectDemo {
    public static void main(String[] args) throws Exception{
        Class catClass = Class.forName("top.hkf.hblog.TomCat");
        TomCat cat = (TomCat) catClass.newInstance();
 
        System.out.println("Class name is " + catClass.getName());
 
        //所有的方法都能获取,但是不能获取到继承的和实现接口的方法
        Method getHello = catClass.getDeclaredMethod("throwHello", String.class);
        //私有的方法需要设置为 true
        getHello.setAccessible(true);
        Object str = getHello.invoke(cat, "Bob");
        System.out.println("getHello result is " + str);
        //能获取 public 方法,包括继承的和实现接口的方法
        Method sayHi = catClass.getMethod("sayHi", String.class);
        sayHi.invoke(cat, "Welcome");
 
        //获取属性
        Field name = catClass.getDeclaredField("name");
        name.setAccessible(true);
        name.set(cat, "tom");
        sayHi.invoke(cat, "Welcome");
 
    }
}
 
class TomCat {
    private String name;
 
    public void sayHi(String helloSentence) {
        System.out.println(helloSentence + " " + name);
    }
 
    private String throwHello(String tag) {
        return "Hello " + tag;
    }
 
    static {
        System.out.println("Hello TomCat");
    }
}

ClassLoader.loadClass()与Class.forName()的区别

resolve参数(classLoder的resolve参数默认是false,forName为true,对类进行链接和初始化)

Class.forName 得到的 class 时已经初始化完成的 ClassLoader.loadClass 得到的 class 是还没有连接的,Spring 的延迟加载使用 classloder.loadClass

 //Driver 中也是有静态代码块初始化了的;
Class.forName("com.mysql.jdbc.Driver");

这篇关于Java反射的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!