简单原理介绍java反射(2)

public class Person {

	private String name;
	private int age;

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

	public   Person(){}

	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;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

	public void show()
	{
		System.out.println("show");
	}

	public void fun(String str)
	{
		System.out.println(str);
	}

	public static void function()
	{
		System.out.println("static");
	}

}
public class Demo1 {

	/**
	 * 反射:动态获取字节码文件对象(Person.class),并对其成员进行运行
	 *
	 * 动态获取字节码文件对象的方式:
	 * 1:任何一个对象都是由字节码文件对象创建的,所以任何一个对象都可以得到自己的字节码文件对象
	 *   那么这个功能应该定义在Object中,所以使用 getClass()
	 *   需要先new对象
	 *
	 * 2:每种数据类型都有一个 静态的class 属性,通过该属性可以得到字节码文件对象
	 *   不需要new对象,但是需要Person类存在
	 *
	 * 3:Class类提供了一个静态的forName(String str)方法
	 *   只需要提供字符串形式的包名+类名
	 * @throws ClassNotFoundException
	 */
	public static void main(String[] args) throws ClassNotFoundException {

          getClaz();
          getClaz2();
          getClaz3();
	}
	//Class类提供了一个静态的forName
	public static void getClaz3() throws ClassNotFoundException
	{
		Class<?> claz1 = Class.forName("com.qianfeng.reflect.Person");

		Class<?> claz2 = Class.forName("com.qianfeng.reflect.Person");

		System.out.println(claz1==claz2);
	}

	//通过静态属性class获取字节码文件对象
	public static void getClaz2()
	{
		Class<Person> claz1 = Person.class;

		Class<Person> claz2 = Person.class;

		System.out.println(claz1==claz2);
	}

	//1:使用Object中的 getClass()获取字节码文件对象
	public static void getClaz()
	{
//		Person person1 = new Person();//先加载Person.class到方法区
//		Class<? extends Person> claz1 = person1.getClass();//得到了 Person.class
//
//		Person person2 = new Person();
//		Class<? extends Person> claz2 = person2.getClass();//得到了 Person.class
//
//		System.out.println(claz1==claz2);//true

	}

}
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Demo2 {

	/**
	 * 动态获取字节码文件对象,并创建对象
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws ClassNotFoundException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 */
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {

		createObj1();
		createObj2();
	}

	//使用带参数的构造方法创建对象
	public static void createObj2() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
	{   //Person person = new Person("小红",20);
		//获取字节码文件对象---Person.class
		Class<?> claz = Class.forName("com.qianfeng.reflect.Person");

		//得到构造方法所属的Constructor类型的对象
		Constructor<?> constructor = claz.getConstructor(String.class,int.class);

		//使用构造方法创建对象--使用Constructor提供的创建对象的功能
		Person person =(Person)constructor.newInstance("小红",20);

		System.out.println(person);

	}

	//当空参的构造方法不存在时,会发生InstantiationException
	//当构造方法的权限过低时,会发生IllegalAccessException
	public static void createObj1() throws ClassNotFoundException, InstantiationException, IllegalAccessException
	{
		//Person person = new Person();
		//获取字节码文件对象---Person.class
		Class<?> claz = Class.forName("com.qianfeng.reflect.Person");

		//使用Class提供的newInstance()方法创建Person类型的对象
		Object obj = claz.newInstance();//使用空参的构造方法创建对象

		Person person = (Person)obj;

		System.out.println(person);
	}

}
import java.lang.reflect.Field;

public class Demo3 {

	/**
	 * 动态创建对象并给属性赋值
	 * @throws ClassNotFoundException
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {

		//Person person = new Person();
		//person.setName("小红");

		//获取字节码文件对象---Person.class
	     Class<?> claz = Class.forName("com.qianfeng.reflect.Person");

	     //得到属性name所属的 Field类型的对象
	     //Field field = claz.getField("name");//只能获取权限是public 的属性
	     //System.out.println(field);//NoSuchFieldException

	     Field field = claz.getDeclaredField("name");

	     //因为name是非静态属性,所以必须通过对象访问,所以先创建对象
	     Object obj = claz.newInstance();

	     //设置name属性为可访问的
	     field.setAccessible(true);// 该方法是从父类中继承的

	     //使用Field类提供的赋值功能,给属性赋值
	     field.set(obj, "小红");

	     System.out.println(obj);

	}

}
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Demo4 {

	/**
	 * 动态创建对象,并调用方法
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws ClassNotFoundException
	 */
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

		method1();
		method2();
		method3();
	}
	//调用静态方法
	public static void method3() throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
	{
		//获取字节码文件对象---Person.class
	     Class<?> claz = Class.forName("com.qianfeng.reflect.Person");

	     ///获取被调用的方法所属的 Method类型的对象
	     Method method = claz.getMethod("function", null);

	     //执行方法
	     method.invoke(null, null);

	}

	//调用带参的构造方法
	public static void method2() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
	{
		//获取字节码文件对象---Person.class
	     Class<?> claz = Class.forName("com.qianfeng.reflect.Person");

	   //获取被调用的方法所属的 Method类型的对象
	     Method method = claz.getMethod("fun", String.class);

	     //fun()属于非静态方式,需要对象去调用
	     Object obj = claz.newInstance();

	     //执行方法
	     method.invoke(obj, "hello");
	}

	//调用无参的构造方法
	public static void method1() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
	{
		// Person person = new Person();person.show();
		//获取字节码文件对象---Person.class
	     Class<?> claz = Class.forName("com.qianfeng.reflect.Person");

	     //获取被调用的方法所属的 Method类型的对象
	     Method method = claz.getMethod("show", null);

	     //show()属于非静态方式,需要对象去调用
	     Object obj = claz.newInstance();

	     //执行方法
	     method.invoke(obj, null);

	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-07 11:27:32

简单原理介绍java反射(2)的相关文章

jvm虚拟机简单原理介绍

一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码的时候,开发工具已经帮你完成了上述的编译工作,因此你可以在对应的目录下看到class文件.此时的class文件依然是保存在硬

Java 反射机制(包括组成、结构、示例说明等内容)

http://www.cnblogs.com/skywang12345/p/3345205.html 第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation

java反射基础知识(五)反射应用实践

详解Java反射各种应用 Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息.通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: Class对象 构造器 变量 方法 私有变量与私有方法 注解 泛型 数组 本文也将从上面几个方面来介绍Java反射.本文涉及的所有代码均在反射代码首先放出一个Java类作为反射的研究对象,类的内容如下: public abstract class FatherObject implements Runnab

初识Java反射

要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念.本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认识过后展开. 反射是Java被视为动态语言的关键,它允许程序在运行时取得任何类的内部信息.Java的这个能力或许在Web应用中用得不是很多,但在一些Java组件开发过程中非常常见,比如Spring.Hibernate等都以此为基础.了解并熟知Java反射机制对我们了解Java框架有很大的帮助. 我们首先写好一个Test类,并将它编译为cl

Java反射、Java代理模式

简单来说,JAVA反射是利用类名称来获得这个类的所有信息:代理,是有个传递过程,将自己的类对象传给其他类,让其他类来代理自己的类对象然后做事: 比喻:订外卖,送餐小哥手里的外卖就是我的对象,是我让他送的.静态代理就是我告诉送餐小哥外卖是我的(假设外卖小哥认识我),然后他直接就奔着我来了:动态代理就是我不告诉送餐小哥我是谁,他也不认识我,我只告诉他我的电话或者地址,他自己想办法找到我:注意,他有什么办法找到我呢?就是反射,他利用我的电话和地址,就知道我的一切了(夸张的说)就可以找到我了. 下面通过

java反射机制简单介绍

1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2.java反射的基础是Class类(注意不是小写的class),Class类实例代表着内存中的一份字节码.常见的获取Class类对象的方法例如以下(第一种为对象的方法,另外一种为类的方法): Dog dog = new Dog(); Class dogClass = dog.getClass();

Java反射机制的原理及在Android下的简单应用

花了几天时间,研究了一下Java的反射机制.在这里总结一下这几天学习的成果,一来分享自己的学习过程和在学习中遇到的问题,二来是给像我一样不太了解Java反射机制的同学做一个简单的介绍.在文章后面会链接一个Android反射机制的应用程序. 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述

Java反射学习总结四(动态代理使用实例和内部原理解析)

通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加相应的代理类.解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能或者说去动态的生成这个代理类,那么此时就必须使用动态代理完成. 动态代理知识点: Java动态代理类位于java.lang.reflect包下,主要有以下一个接口和一个类: 1.InvocationHandler接口:    

Java 反射机制介绍

参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation注解"等内容.