TestReflect.java

package com.huawei.reflect;

public class TestReflect {

int a =0;

private String name = "lisi";

protected long b = 2L;

public double c = 3.0d;

public static short e = 20;

static String fav = "read";


public void add(int a,int b){
System.out.println(a+b);
}
public void add(int a,String b){
System.out.println(a+b);
}

private static String say(){
return "Hello static say";
}
private String say(String msg){
return "Hello "+msg;
}

static int add(int a){
return a+100;
}

public static int add(int a,int b, int c){
return a+b+c;
}

public TestReflect() {
System.out.println("TestRefect.TestRefect()");
}
TestReflect(int a) {
System.out.println("TestRefect.TestRefect() "+a);
}

public TestReflect(long b, double c) {
super();
this.b = b;
this.c = c;
System.out.println("this is a test");
}

}

 

Test.java

package com.huawei.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
public static void testGetClass() throws ClassNotFoundException {

/**
* 得到一个类的class对象
*
* 有一下几种方式
*/

//直接通过类名.class 得到class对象
Class<?> clazz = TestReflect.class;

//通过对象.getClass() 方法得到
Class<?> clazz1 = new TestReflect().getClass();

//通过Class提供的forName方法
Class<?> clazz2 = Class.forName("com.cdsxt.reflect.TestReflect");

System.out.println(clazz);
System.out.println(clazz1);
System.out.println(clazz2);


}

/**
* 测试 得到 类里面的 属性
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static void testGetField() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
//得到 类的结构信息
Class<?> clazz = TestReflect.class;

//得到 公共的成员字段
Field c = clazz.getField("e");

TestReflect t = new TestReflect();
Object oo = new TestReflect();
Object oo1 = new TestReflect(3L,50.0d);
// t.e;
// TestReflect.e;

//oo.c
//如果 该属性是隶属于类的 则 取值的时候 不需要指定对象 直接穿null
// Object o = c.get(oo1);
Object o = c.get(null);


System.out.println(o);
//属性名
System.out.println(c.getName());
//得到修饰符
System.out.println(c.getModifiers());
//得到Field的class对象
System.out.println(c.getClass());
//得到属性字段的类型
System.out.println(c.getType());


System.out.println("--------------------");
//获取 给定类里面的 所有公有的 公共属性
Field []fields = clazz.getFields();
for(Field f:fields){
System.out.println(f.getName());
//得到修饰符
System.out.println(f.getModifiers());
//得到Field的class对象
System.out.println(f.getClass());
//得到属性字段的类型
System.out.println(f.getType());
}


//获取已有的属性字段

Field name = clazz.getDeclaredField("name");
//得到原来的状态
boolean flag = name.isAccessible();
//然后在强制打开
name.setAccessible(true);
System.out.println(name.get(oo1));
//将原来的状态设置回去
name.setAccessible(flag);
//System.out.println(name.get(oo1));
}

/**
* 测试 获取方法
*/
public static void testGetMethod() throws Exception{
Class<?> clazz = TestReflect.class;
//o.add(1,2)
//得到 一个方法的对象

Method method = clazz.getMethod("add", int.class,String.class);
//第二种写法

Method add = clazz.getMethod("add", new Class[]{int.class,int.class});
Object o = new TestReflect();
//o.add();
method.invoke(o, 1,"Hello");
add.invoke(o, new Object[]{2,10});

//获取静态方法
Method add1 = clazz.getMethod("add", new Class[]{int.class,int.class,int.class});
//通过对象调用
// Object rs = add1.invoke(o, 10,20,30);
//通过类去调用
Object rs = add1.invoke(null, 10,20,30);

System.out.println(rs);

System.out.println("----------------------");
/**
* 调用没有参数的 方法的时候 在回去的时候 可以不传
*
* 在执行的时候 也可以不传
*
* 除了public的方法或是 属性或是构造器以外的 都要注意 他们的可访问性
*
*/
Method m = clazz.getDeclaredMethod("say");
m.setAccessible(true);
Object msg = m.invoke(null);
System.out.println(msg);

}

/**
* 测试创建实例
*/
public static void testCreateInstance() throws Exception{
Class<?> clazz = TestReflect.class;
//创建实例
//如果要使用 以下的这种方式 在给定类中 必须要存在 无参构造器
Object o = clazz.newInstance();

System.out.println(o);

// Class<TTT> c = TTT.class;
// c.newInstance();

//得到特定的构造器 然后创建实例
Constructor<?> constructor = clazz.getConstructor(new Class[]{long.class,double.class});

Object o1 = constructor.newInstance(new Object[]{20L,30.0d});
System.out.println(o1);

}



public static void main(String[] args) throws Exception {
// testGetClass();
// testGetField();
// testGetMethod();

testCreateInstance();
}
}

class TTT{

public TTT(int a) {
super();
}

}