Java反射(1)

news/2024/7/8 4:51:46

Java反射
Java反射机制是运行状态中,对于任意一个类都能够知道这个类的所有属性和方法(包括私有的);对于任意一个对象,都能够调用他的任意方法和属性;这种动态动态获取信息及动态调用对象方法的功能称为功能称为Java的反射机制。
1.用途
①在运行时判断任一对象所属的类。
②在运行时构造任意一个类的对象。
③在一个类运行时判断任意一个类所具有的的成员变量和方法。
④在运行时调用任意一个对象的方法。
java反射的目的:高内聚,低耦合
java反射实现了不用知道类就能实例化,不用硬编程
归根结底反射的作用:通过反射访问java的属性、方法、构造方法等。

可以这样理解,类是用来抽象的描述了对象的属性、方法、构造方法,而反射就是把类当做一个集合,抽象的描述类的特征。


2.得到class类的对象的三种方式

package reflect;

public class Student {

	private String name;
	private  int age;
	public int money;
	public Student(String name) {
		this.name =name;
	}
	public void getage(int age) {
		this.age = age;
	}
}

package reflect;

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

public class Test {

	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		// TODO 自动生成的方法存根

	  //1.第一种方式,通过类的静态方法——forName()来实现(注意Name的首字母)
	  Class<?> class1 = Class.forName("reflect.Student");
	  //2.通过类的class属性来获得Class对象
	  Class<Student> class2 = Student.class;
	  //3.通过对象.getClass()方法来获得
	  Student student  = new Student();
	  Class<?>class3 = student.getClass();
	  //***********************************************************************************
	  //Field类(属性)
	  
	  //获取class对象的所有属性
	  Field[] allField =class1.getDeclaredFields();
	  
	  //获取class对象的所有公有属性
	  Field[] publicField = class1.getFields();
	  
	  //获取class对象指定的属性,可以是私有属性
	  Field nameField = class1.getDeclaredField("name");
	  Field monField = class1.getField("money");
	  
	  //************************************************************************************
	  //Method类(方法)
	  //获取class对象所有声明的方法
	  Method[] methods = class1.getDeclaredMethods();
	  
	  //获取class类的所有的public方法包括父类的方法
	  Method[] allMethods = class1.getMethods();
	  
	  //返回class对象对应类的带指定形参列表的方法
	  Method method = class1.getMethod("age", int.class);
	  
	  //****************************************************************************************
	  //Constructor(构造方法)
	  //获取class对象所有声明的构造函数
	  Constructor<?>[] allConstructors = class1.getDeclaredConstructors();
	  
	  //获取class对象的public构造函数
	  Constructor<?>[] publicConstructors = class1.getConstructors();
	  
	  //获取指定声明的构造函数
	  Constructor<?> constructor = class1.getDeclaredConstructor(String.class);
	  
	  //获取指定的public 构造函数
	  Constructor publicconstructor = class1.getConstructor(String.class);
	  
	  
	  //*****************************************************************************************
	  //生成实例对象
	  //方式1。通过class对象直接调用newInstance方法,获得实例对象
	  //使用方法1,要求Class对象有默认的构造器,而执行newINstance就是在执行其默认的构造器方法
	  Object object = class1.newInstance();
	  
	  //方式2.通过先得到class对象获取到指定的构造函数
	  Constructor<?> constructor2 = class1.getDeclaredConstructor(String.class);
	  Object obj = constructor2.newInstance("XiaoBai");
	  
	  //*********************************************************************************************
	  //调用方法()
	  //方式1.通过Class对象的额getMethods()方法或者getMethod()方法得到指定的方法,返回Method数组或者对象
	   //在调用方法之前要先生成新的对象
	  //  Object object = class1.newInstance();
	  //需要先获得和该方法对应的Method对象
	  Method method2 = class1.getDeclaredMethod("getage", int.class);
	  //调用指定的函数并传递参数
	  method2.invoke(obj, 18);
 
	  
	}

}


http://www.niftyadmin.cn/n/2434440.html

相关文章

【定制化图像开放平台】入门实例之手写数字模型训练

为什么80%的码农都做不了架构师&#xff1f;>>> 本帖主要用手写数字为例进行一个简单入门实例总结(非官方) 平台网站:http://ai.baidu.com/customize/app/model/ 定制化图像开放平台使用教程之一:http://ai.baidu.com/forum/topic/show/492760定制化图像开放平台使用…

泛型新手心得

泛型 是JDK1.5版本后出现的新特性&#xff0c;是一个类型安全机制。 优势 1.将运行时出现的ClassCastException转移到编译时期&#xff0c;方便程序员解决问题&#xff0c;让运行时问题减少&#xff0c;更安全。 2.避免了强制转换的麻烦。 ArraryList<String> al new Ar…

python小游戏(剪刀石头布)

#!/usr/bin/python#-- coding: utf8--import random #导入随机数的模块 computer random.choice([石头, 剪刀, 布])player raw_input(请出拳(石头/剪刀/布): ) print "Your choice: %s, Computers choice: %s" % (player, computer)if player 石头:if computer 石…

java反射(2)——属性的操作

java反射 之前的博客java反射讲了有关java反射的基础知识&#xff1a;什么是java发射&#xff0c;如何获取Class对象&#xff0c;如何获取到Class对象的属性、方法和构造方法等。 今天的博客主要有关如何操作属性、方法、构造方法 我们直接进入主题&#xff1a;要想操作一个类…

Android NDK开发之旅11 JNI JNI数据类型与方法属性访问

###JNI数据类型 #####JNI的数据类型包含两种: 基本类型和引用类型 ####基本类型 基本类型主要有jboolean, jchar, jint等, 它们和Java中的数据类型对应关系如下表所示: Java类型JNI类型描述booleanjboolean无符号8位整型bytebyte无符号8位整型charjchar无符号16位整型shortjsho…

装饰设计模式详解

装饰设计模式 模式定义和动机 装饰模式可以在不改变一个对象本身的基础上给对象增加额外的新行为&#xff08;方法&#xff09;&#xff0c;在实现生活中的例子有很多&#xff0c;买了毛坯房需要装修&#xff0c;我们每个人对毛坯房的新装修&#xff08;新功能&#xff09;可能…

转载 React.createClass 对决 extends React.Component

先给出结论&#xff0c;这其实是殊途同归的两种方式。过去我们一般都会使用 React.createClass 方法来创建组件&#xff0c;但基于 ES6 的小小语法糖&#xff0c;我们还可以通过 extends React.Component 来创建组件。 这两种创建方式之间的差别很小&#xff0c;但只有了解这些…

java反射(3)——方法、构造方法操作

之前的博客中已经总结了如何对属性进行操作&#xff0c;今天的博客主要总结反射是如何操作方法和构造方法的 今天的博客是有关于如何获得、使用类中的方法和构造方法。 直接上代码&#xff1a; 我们写一个Person类&#xff0c;写一些方法和构造方法还写了一个普通的方法&#…