JAVA的反射
•发布于   •作者 会飞的胖波  •260 次浏览  •来自 博客

        反射机制:程序在运行时能够获取自身的信息。在JAVA中,只要给定类名就可以通过反射来获取类中的信息。

        说到这就不得不说JAVA的编写特点:(1)JVM至始至终运行的都是字节码,而不是源代码。(2)创建对象实际上是类所对应的字节码在创建。(3)JAVA中不允许存在两个完全相同的类存在(类名+包名相同)。所以利用了JAVA这样特性。

        反射的优点:动态获取,体现了JAVA的灵活性。但是缺点也是不可忽视的就是操作的慢,对性能有影响。

        其中获取类的方法有三种:

public class Demo {

	public static void main(String[] args) {
		Student s = new Student("碧玺", 21);
		Class c1 = s.getClass();//通过对象调用。
		System.out.println(c1.getName());
		System.out.println(c1.getClass().getName());
		System.out.println(c1.getSuperclass().getName());
		System.out.println("-------------------------------");
		Class c2 = Student.class;//通过类名直接调用。
		System.out.println(c2.getName());
		System.out.println(c2.getSuperclass().getName());
		System.out.println("-------------------------------");
		try {
			Class c3 = Class.forName("com.cc.demo.Student");//通过Class的forNameF方法调用
			System.out.println(c3.getName());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

class Student {
	private String name;
	private int age;

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

       还有就是反射中的一些获取属性、构造方法的方法。


Class c=Class.forName("com.cc.demo1.Work");
		Constructor cs=c.getConstructor(String.class,int.class,int.class,String.class,int.class);
		Object o=cs.newInstance("jack",20,123,"dad",100);
		System.out.println(o);
		System.out.println("===========================");
		Field[]f1=c.getFields();//获取子父类中的公共属性。
		for(Field f:f1){
			System.out.println(f.getName());
		}
		System.out.println("===========================");
		Field f2=c.getField("num");//获取特定的公共属性。
		System.out.println(f2.getName());
		System.out.println("===========================");
		Field f3=c.getDeclaredField("stu");//获取特定的本类属性。
		System.out.println(f3.getName());
		Method m1=c.getMethod("getAge");
		System.out.println(m1.getName());
		Method[]m2=c.getDeclaredMethods();//获取本类的属性。
		for(Method m:m2){
			System.out.print(m.getName());
		}
		Method m3=c.getDeclaredMethod("a");//获取本类的方法。
		Work w=new Work(null, 0, 0, null, 0);
		m3.setAccessible(true);//暴力反射方法。
		m3.invoke(w);
		Class c1=w.getClass();
		
		Field f=c1.getDeclaredField("stu");
		f.setAccessible(true);
		f.set(w, "20");
		Object o1=f.get(w);
		System.out.println(o1);
	
	}

 最后说个比较有意思的应用就是我们可以获取私有的属性,但是并不能访问,所以无法修改它的值,而此时我们就需要一个办法那就是暴力方法:对象名+setAccessible(true)来使private访问修饰符暂时失效,这个就是JAVA中的暴力反射,这个方法是不是很黄很暴力,咳咳。。。。。不过不推荐多使用它。


2 回复
我喜欢吃肉

可以 很强势

Crazyx

加油  可以的

回到顶部

©2017 Powered by 三十三行伪代码
皖ICP备17005175号-3