java最简单反射实例_Java反射机制简单实例

简单实例

car类

public class Car {

private String brand;

private String color;

private int maxSpeed;

public Car(){System.out.println("init car!!");}

public Car(String brand,String color,int maxSpeed){

this.brand = brand;

this.color = color;

this.maxSpeed = maxSpeed;

}

public void introduce() {

System.out.println("brand:"+brand+";color:"+color+";maxSpeed:"+maxSpeed);

}

//省略get set方法、

}

ReflectTest

有几个重要的反射类:ClassLoader、Class、Constructor、Method、

import java.lang.reflect.Constructor;

import java.lang.reflect.Method;

public class ReflectTest {

public static Car initByDefaultConst()throws Throwable{

//通过类装载器获取Car类对象

ClassLoader loader = Thread.currentThread().getContextClassLoader();//获取当前线程的ClassLoader、

Class clazz = loader.loadClass("com.smart.reflect.Car");//通过指定的全限定类名com.smart.reflect.Car装载Car类对应的反射实例、

//获取类的默认构造器对象并通过它实例化Car

Constructor cons = clazz.getDeclaredConstructor((Class[])null);

Car car = (Car)cons.newInstance();//效果等同于new Car()、

//通过反射方法设置属性

Method setBrand = clazz.getMethod("setBrand",String.class);//方法名和方法入参的对象类型、

setBrand.invoke(car,"红旗CA72");//调用目标类的方法,操作的目标类的对象实例,目标方法的入参、

Method setColor = clazz.getMethod("setColor",String.class);

setColor.invoke(car,"黑色");

Method setMaxSpeed = clazz.getMethod("setMaxSpeed",int.class);

setMaxSpeed.invoke(car,200);

return car;

}

public static void main(String[] args) throws Throwable{

Car car = initByDefaultConst();

car.introduce();

}

}

通过反射调用private和protected成员变量和方法

通过类实例变量无法在外部被访问和调用、但通过反射机制可以绕过这个限制、

必须通过setAccessible(boolean access)方法取消Java语言检查,否则将抛出IllegalAccessException、如果JVM的安全管理器设置了响应的安全机制,那么调用该方法将抛出SecurityException、

PrivateCar

public class PrivateCar {

private String color;

protected void drive(){

System.out.println("drive private car! the color is:"+color);

}

}

ReflectTest

public class ReflectTest {

public static void main(String[] args) throws Throwable{

ClassLoader loader = Thread.currentThread().getContextClassLoader();

Class clazz = loader.loadClass("com.smart.reflect.PrivateCar");

PrivateCar pcar = (PrivateCar)clazz.newInstance();

Field colorFld = clazz.getField("color");

//取消Java语言访问检查以访问private变量

colorFld.setAccessible(true);

colorFld.set(pcar,"红色");

Method driveMtd = clazz.getDeclaredMethod("drive",(Class[])null);

//取消Java语言访问检查以访问protected方法

driveMtd.setAccessible(true);

driveMtd.invoke(pcar,(Class[])null);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值