Java反射初探

理解反射

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

反射也可以跳过泛型

实现反射的方法

Object类之中存在有一个getClass()方法:public final Class<?> getClass();

此方法不能被子类所复写,所有类的实例化对象都可以引用

利用"包.类.class"的形式实例化Class类对象

例如:java.util.Date.class,在一些开源框架中会大量使用

利用Class类中的提供的forName()方法(常用)。

使用反射调用方法

  1. forName()方式
public class Test {
    public static void main(String[] args)  {
        try {
            //第一种,类名.calss
            Class c1 = Demo.class;
            //第二种,使用类的对象
            Demo demo1 = new Demo();
            Class c2 = demo1.getClass();
            //第三种
            Class c3 = Class.forName("com.sank.reflect.test.Demo");
            //使用反射调用方法
            ((Demo)c3.newInstance()).demo();    //使用newInstance时,类中必须有构造方法
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
class Demo {
    public void demo(){
        System.out.println("hello");
    }
}

2.getClass方式

public class Test{
    public static void main(String[] args) {
        A a = new A();
        Class<? extends A> c = a.getClass();
        try {
            Method method = c.getMethod("print", int.class, int.class);
            method.invoke(a,20,30);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class A{
    public void print(int a,int b){
        System.out.println(a+b);
    }
}

使用反射调用成员变量

package com.sank.reflect.reflectmember;
import java.lang.reflect.Field;
/**
 * @description:
 * @auther Sank
 * @date 2018/9/19 17:01
 */
public class Test {
    public static void main(String[] args) {
        ClassUtil.mumber(new Demo());
    }
}
class ClassUtil{
    public static void mumber(Object o){
        Class<?> c = o.getClass();
        System.out.println("类的名称是:"+c.getName());
        Field[] fs = c.getDeclaredFields();
        for (Field field:fs) {
            System.out.println(field.getType().getName()+" "+field.getName());
        }
    }
}
class Demo {
    int n1 = 10;
    private float n2 = 4.5F;
    protected double n3 = 4.6D;
    long n4 = 900000L;
    private boolean n5 = false;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值