java反射机制概述

一、反射

1、概述:

JAVA反射机制是在运行状态中,对于任意一个类,都能够创建该类对象,调用这个类的所有属性和方法包括构造方法;

2、字节码文件

1)概述:

类加载器负责将.class文件加载到内在中,并为之生成对应的Class对象

2)字节码文件对象的三种获取方式

A:Object类的getClass()方法

B:所有类包括基本数据类型的静态属性class

如:int.class; String.class

C:Class类中静态方法forName(String className) //参数:className - 所需类的完全限定名

3、Class类

1)获取构造器:

获取其类全部构造器:返回表示此类构造方法的 Constructor 对象数组

public Constructor<?>[] getConstructors() //只能获取其公共构造器

public Constructor<?>[] getDeclaredConstructors() //获取所有构造器包括私有

获取其类一个构造器:

参数:可变参数,参数数组,传入需要调用的构造器的参数的字节码文件(类型.class)

返回值:与指定的 parameterTypes 相匹配的构造方法的 Constructor 对象

public Constructor<T> getConstructor(Class<?>... parameterTypes) //只能获取其公共构造器

public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) //获取所有构造器包括私有

通过获取的构造器调用newInstance(Object... initargs)方法就可以创建该类对象

通过Class类的public T newInstance()方法也可以用来创建该类的无参对象

2)获取属性

获取所有成员变量:返回表示字段的 Field 对象的数组

public Field[] getFields() //只能获取其公共属性

public Field[] getDeclaredFields() //获取所有属性

获取单个成员变量

参数:需要获取的属性的名称

返回值:由 name 指定的该类的 Field 对象

public Field getField(String name) //只能获取其公共属性

public Field getDeclaredField(String name) //获取所有属性

使用Field的public void set(Object obj,Object value)方法可以给该属性赋值

参数: obj:应该修改其字段的对象

value:正被修改的 obj 的字段的新值

3)获取成员方法

获取所有成员方法:表示此类中方法的 Method 对象的数组

public Method[] getMethods() //获取所有的共有的方法,包括父类的公共方法

public Method[] getDeclaredMethods() //获取所有的方法对象,包括私有的

获取单个成员方法

public Method getMethod(String name,Class<?>... parameterTypes) //获取指定的方法对象

public Method getDeclaredMethod(String name,Class<?>... parameterTypes) //获取包括私有的方法对象

使用Method的public Object invoke(Object obj,Object... args)调用方法

参数: obj:从中调用底层方法的对象

Object... args:该方法的参数

4、取消语法检查

1)AccessibleObject类 —— 是 Field、Method 和 Constructor 对象的基类

直接已知子类:Constructor, Field, Method

2)public void setAccessible(boolean flag)throws SecurityException

当flag是true的时候则指示反射的对象在使用时应该取消 Java 语言访问检查

3)使用:

在使用反射创建类的私有化对象、给私有化属性赋值、调用私有化方法的时候,需要先调用此方法,取消语法检查;

就是执行newInstance()、set()、invoke()前调用setAccessible(true)

5、运行配置文件

import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.util.Properties;
//通过反射运行配置文件内容
public class Test {
    public static void main(String[] args) throws Exception {
	//将配置文件读取到Properties集合中
	Properties pro = new Properties();
	pro.load(new FileInputStream("a.txt"));
	//通过键找值获取到需要创建对象的类的完全限定名,获取其字节码文件对象
	Class<?> clazz = Class.forName(pro.getProperty("classname"));
	//通过键找值获取到需要调用的成员方法
	Method met = clazz.getMethod(pro.getProperty("methodname"));
	//执行
	met.invoke(clazz.newInstance());
    }
}
public class Student {
  public void show(){
        System.out.println("这是学生类的show方法");
  }
  public void method(){
	System.out.println("这是学生类的method方法");
    }
}
public class Teacher {
    public void show(){
	System.out.println("这是老师类的show方法");
    }
    public void method(){
	System.out.println("这是老师类的method方法");
    }
}

---------------------------------------------------------

当前项目下的a.txt配置文件

classname = 所需类的完全限定名

methodname = show

---------------------------------------------------------

需要修改时候只需改变其配置文件的值

6、越过泛型检查

import java.lang.reflect.Method;
import java.util.ArrayList;
public class ArrayListDemo {
    public static void main(String[] args) throws Exception{
	ArrayList<String> al = new ArrayList<String>();
	al.add("Hello");
	al.add("java");
	//想要加入一个int类型的数10
	//获取其字节码文件对象
	Class<?> clazz = al.getClass();
	//调用add方法
	Method m = clazz.getMethod("add", Object.class);
	//取消语法检查
	m.setAccessible(true);
	//添加10,并遍历
	m.invoke(al, 10);
	for(Object o : al){
		System.out.println(o);
	}
    }
}

7、动态代理

1、概述:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象

在Java中提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象

2、Proxy类 —— 生成代理对象JDK提供的代理只能针对接口做代理

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

// 参数1:类加载器 通过Class类的getClassLoader()调用

// 参数2:类加载器对应的接口数组 通过Class的getInterfaces()调用

// 参数3:你要让这个代理对象帮你干的事情

//返回值:可以强转成被代理类所实现的接口的对象,调用被代理的方法

//自定义一个类实现InvocationHandler接口,重写public Object invoke(Object proxy, Method method, Object[] args)方法

// 参数1:代理对象 Object proxy

// 参数2:被代理类里面的方法对象

// 参数3:被代理类里面的方法对象要的参数的值

//返回值:被代理类对象所表示方法的结果

3、动态代理的实现

1)用户接口类

                    public interface Userdao {
			void add();
			void del();
			void revise();
			void look();
		    }

2)用户接口的实现类

                    public class Userdaoimpl implements Userdao{
			@Override
			public void add() {
				System.out.println("增");
			}
			@Override
			public void del() {
				System.out.println("删");
			}
			@Override
			public void revise() {
				System.out.println("改");
			}
			@Override
			public void look() {
				System.out.println("查");
			}
		    }

3)测试类

                    import java.lang.reflect.Proxy;
    		    public class UserDemo {
			public static void main(String[] args) {
				Userdaoimpl user = new Userdaoimpl();
				Class<? extends Userdaoimpl> clazz = user.getClass();
				Object obj = Proxy.newProxyInstance(clazz.getClassLoader(), 
						clazz.getInterfaces(),new MyInvocationHandler(user));
				Userdao newuser = (Userdao) obj;
				newuser.add();
				newuser.del();
				newuser.revise();
				newuser.look();
			}
	            }

4)InvocationHandler的实现类

                    import java.lang.reflect.InvocationHandler;
		    import java.lang.reflect.Method;
		    public class MyInvocationHandler implements InvocationHandler {
			Object obj;
		        public MyInvocationHandler(Object obj) {
				super();
				this.obj = obj;
			}
			@Override
			public Object invoke(Object proxy, Method m, Object[] arg)throws Throwable {
				System.out.println("权限校验");
				Object object = m.invoke(obj, arg);
				System.out.println("记录日志");
				return object;
			}
		    }
时间: 2024-08-10 19:21:25

java反射机制概述的相关文章

Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法在上例的基础上更进一步的降低了类与类之间的耦合.我们还可以对某对象所需要的其它对象进 行注入,这种注入都是在配置文件中做的,Spring的IOC的实现原理利用的就是Java的反射机制, Spring还充当了工厂的角色,我们不需要自己建立工厂类.S

java反射学习之一反射机制概述

一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名,就能通过反射获取类的所有信息 2.程序在运行是能够获取任何一个对象所属的类对象 3.在运行时可以获取类的所有属性,并对其操作 4.在运行时可以获取类.父类的所有方法并调用 5.当前的主流框架struts2.srping.hiberate等框架的核心功能都是通过java反射机制来实现的 三.反射相关对

反射——Java反射机制

反射概述 什么是反射? ①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ②   JAVA反射机制是在运行状态中,对应任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种状态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. ③   简单的说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息.包括其访问

面试题之------Java 反射机制

一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制. Class 类与java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了Field,Method,Constructor类(每个类都实现了Member 接口).这些类型的对象时由JVM 在运行时创建的,用以表示未知类里对应的成员. 这样你就可

JAVA反射机制,总结下

1.总体概述 Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法:对于给定的一个对象,都能够调用它的任意一个属性和方法.这种动态获取类的内容以及动态调用对象的方法称为反射机制 2.反射的用途,意义 (1)反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力. (2)通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类. (3)使用反射机制能够在运行时构造一个类的对象.判断一个类所具有的成员变量和方法.调用一个对

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java反射机制浅析

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用