public class Car {
private String Brand;
private String color;
private int maxSpeed;
public String getBrand() {
return Brand;
}
public void setBrand(String brand) {
Brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public 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);
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class privateCarReflect {
public static void main(String[] args) throws Throwable {
//通过类加载器获取Car类对象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.smart.reflect.Car");
//获取类的默认构造器对象并通过它实例化Car
Constructor cons = clazz.getDeclaredConstructor((Class[]) null);
Car car = (Car) clazz.newInstance();
//通过反射方法设置属性
//因为每个属性都已经设置了set、get方法,因此可以通过getMethod设置所有的属性 当然还有另外一种方法getDeclaredField
Method setBrand = clazz.getMethod("setBrand", String.class);
setBrand.invoke(car, "HA");
Field colorfldField = clazz.getDeclaredField("color");
colorfldField.setAccessible(true);
colorfldField.set(car, "red");
Field maxSpeedField = clazz.getDeclaredField("maxSpeed");
maxSpeedField.setAccessible(true);
maxSpeedField.set(car, 1000);
car.introduce();
}
}
package com.smart.reflect;
import java.lang.reflect.Field;
/*
*在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性
* 这种动态获取对象的信息以及动态调用对象的方法的功能称之为Java 语言的反射机制。
* Java的反射机制容许程序在运行的时候加载、探知、使用编译期间完全未知的class。
* 换句话说 java可以加载一个运行的时候才得知名称的class 获取其完整的结构
* 在的Java语言中,任何一个类都可以得到对应的class实例,通过class实例就可以获取类或者对象的所有信息,包括属性、方法、或者是构造方法。
* */
class ReadOnlyClass{
private Integer age=20;
public Integer getAge(){
return age;
}
}
public class Test{
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
ReadOnlyClass pt=new ReadOnlyClass();
ReadOnlyClass pt2=new ReadOnlyClass();
Class<?> clazz=ReadOnlyClass.class;
Field field=clazz.getDeclaredField("age");
field.setAccessible(true);
field.set(pt,30);
System.out.println(pt.getAge());
System.out.println(pt2.getAge());
}
}