java 反射 基本知识——属性和方法

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

 

这里的异常也没有处理 因为 只是一个简单的例子,真正开发是 记得要处理异常哦。

 

构造器,属性,方法都能加注解 这个会在注解的篇章里 介绍一下 

 

 

 

你可能感兴趣的:(基础)