package demo;
public class ReflectTest {
private String name;
private String type;
// Constructors
public ReflectTest() {
System.out.println("Constructor ReflectTest () is invoking");
}
// 私有构造器
private ReflectTest(String name) {
this.name = name;
System.out.println("Constructor ReflectTest(String name) is invoking.");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
private void say(String str) {
System.out.println("hello " + str);
}
private void see() {
System.out.println("hello ");
}
}
属性:
这里我将所有的异常都抛出,正常情况下 我们应该在内部将异常处理到,这里只是为了演示所以没有处理。
public static void main(String str[]) throws Exception{
Class cls = null;
cls = Class.forName("demo.ReflectTest");
ReflectTest obj = null;
//创建对象
obj = (ReflectTest) cls.newInstance();
//取到该类的所有属性
Field[] fields = cls.getDeclaredFields();
for (Field f : fields) {
System.out.println("完整输出 " + f.toString());
System.out.println("类型 " + f.getType().getSimpleName());
System.out.println("属性名 " + f.getName());
System.out.println("修饰符 " + f.getModifiers());
//破处私有权限
f.setAccessible(true);
System.out.println("属性赋值前: "+f.get(obj));
f.set(obj, f.getName() + "||" + f.getModifiers());
System.out.println("属性赋值后: "+f.get(obj));
System.out.println();
}
//单去一个属性
Field f=cls.getDeclaredField("name");
f.setAccessible(true);
System.out.println(f.get(obj));
}
输出结果:Constructor ReflectTest () is invoking
完整输出 private java.lang.String demo.ReflectTest.name
类型 String
属性名 name
修饰符 2
属性赋值前: null
属性赋值后: name||2
完整输出 public java.lang.String demo.ReflectTest.type
类型 String
属性名 type
修饰符 1
属性赋值前: null
属性赋值后: type||1
name||2
修饰符对照表
java.lang.reflect.Modifier | ||
---|---|---|
public static final int | ABSTRACT | 1024 |
public static final int | FINAL | 16 |
public static final int | INTERFACE | 512 |
public static final int | NATIVE | 256 |
public static final int | PRIVATE | 2 |
public static final int | PROTECTED | 4 |
public static final int | PUBLIC | 1 |
public static final int | STATIC | 8 |
public static final int | STRICT | 2048 |
public static final int | SYNCHRONIZED | 32 |
public static final int | TRANSIENT | 128 |
public static final int | VOLATILE | 64 |
方法:
Class cls = null;
cls = Class.forName("demo.ReflectTest");
ReflectTest obj = null;
//创建对象
obj = (ReflectTest) cls.newInstance();
Method see=cls.getDeclaredMethod("see");
see.setAccessible(true);
//输出 hello
see.invoke(obj);
Method[] methods =cls.getDeclaredMethods();
Method getmet=null;
Method setmet=null;
for(Method m:methods){
if("getName".equals(m.getName())){
getmet=m;
}
if("setName".equals(m.getName())){
setmet=m;
}
}
//没有值 输出null
System.out.println("getName值:"+getmet.invoke(obj));
System.out.println("给 Name赋值 setName(“hello word”)");
setmet.invoke(obj,"hello word");
System.out.println("getName值:"+getmet.invoke(obj));
输出结果
Constructor ReflectTest () is invoking
hello
getName值:null
给 Name赋值 setName(“hello word”)
getName值:hello word
这里的异常也没有处理 因为 只是一个简单的例子,真正开发是 记得要处理异常哦。
构造器,属性,方法都能加注解 这个会在注解的篇章里 介绍一下