`
schy_hqh
  • 浏览: 555716 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(基础)java中的反射

 
阅读更多

 

反射---最大的应用:反射配置文件中的类路径,动态创建对象,增强扩展性,灵活性

反射:一般被反射的类,都需要一个默认的构造函数,即无参构造函数不要被覆盖了!

 

反射构造函数

反射类的字段

反射类的方法

 

package com.gc.reflect;

public class Person {
	
	private String name;
	
	private int age;
	
	public static String country = "CN";
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person() {
		super();
	}
	
	private void privateMethod(String param) {
		System.out.println("Person.privateMethod():"+name+"---"+param);
	}
	
	public void show() {
		System.out.println("Person.show():"+this.name);
	}
	
	public static void staticMethod() {
		System.out.println("Person.staticMethod():"+country);
	}
}

 

 

package com.gc.reflect;

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

public class Reflect {
	public static void main(String[] args)throws Exception {
		//getObjectClass();
		//newObjectInstance();
		//getConstructors();
		//getObjectFields();
		getObjectMethods();
	}
	
	/**
	 * 获取字节码文件对象
	 * @throws ClassNotFoundException
	 */
	public static void getObjectClass() throws ClassNotFoundException {
		Class clazz1 = Person.class;
		Class clazz2 = new Person().getClass();
		Class clazz3 = Class.forName("com.gc.reflect.Person");//服务器:读取配置文件---反射---接口---多态
		System.out.println(clazz1==clazz2);
		System.out.println(clazz1==clazz3);
	}
	
	/**
	 * 无参构造函数创建对象
	 * @throws Exception
	 */
	public static void newObjectInstance() throws Exception {
		//加载字符串所指的类,并编译为字节码,得到Class对象
		Class clazz =  Class.forName("com.gc.reflect.Person");
		
		//调用类的无参构造函数,创建对象
		Object object = clazz.newInstance();
		
	}
	
	/**
	 * 获取带参数的构造方法,并通过这个构造函数创建对象
	 */
	public static void getConstructors() throws Exception {
		Class clazz =  Class.forName("com.gc.reflect.Person");
		//获取带参数的构造方法
		Constructor cons = clazz.getConstructor(String.class,int.class);
		//传入产生,创建对象
		Object obj = cons.newInstance("zs",20);
		
	}
	
	
	/**
	 * 获取类中的字段
	 * clazz.getFields();//本类和父类中所有的共有成员
	 * clazz.getDeclaredFields();//只获取本类,包括私有成员
	 */
	public static void getObjectFields() throws Exception {
		Class clazz =  Class.forName("com.gc.reflect.Person");
		
		Field field = clazz.getDeclaredField("name");
		
		if(!field.isAccessible()) {
			field.setAccessible(true);
		}

		Object obj = clazz.newInstance();
		
		//为字段设置值
		field.set(obj, "xiaoqiang");
		
		//获取字段的值
		Object name = field.get(obj);
		
		System.out.println(name);
	}
	
	/**
	 * 调用类中的方法
	 */
	public static void getObjectMethods() throws Exception {
		Class clazz =  Class.forName("com.gc.reflect.Person");
		Constructor cons = clazz.getConstructor(String.class, int.class);//注意:int.class != Integer.class
		Object obj = cons.newInstance("beabai",26);
		Method[] methods = clazz.getDeclaredMethods();
		for(Method m : methods) {
			if(!m.isAccessible())
				m.setAccessible(true);
			if("privateMethod".equals(m.getName()))
				m.invoke(obj, "hello");
			else 
				m.invoke(obj, (Object[])null);
		}
	}
	
}

 

 

 

分享到:
评论

相关推荐

    JAVA基础--JAVA中的反射机制详解

    JAVA 反射机制是 Java 语言中的一种动态获取信息和动态调用对象方法的功能。它允许程序在运行时获取类的信息、构造对象、获取成员变量和方法、调用对象的方法等。 Java 反射机制主要提供了以下功能: 1. 在运行时...

    java反射,获取所有属性、方法以及List集合类

    首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`方法或者对象的`getClass()`方法来获取`Class`对象。一旦我们有了`Class`对象,就可以进一步...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    Java反射性能测试分析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...

    java反射源代码

    一、Java反射的基础概念 Java反射源于Java.lang.Class类,它代表了Java运行时的类信息。通过Class对象,我们可以获取到类的构造器、方法、字段等信息,甚至可以动态地实例化对象和调用其成员。例如,`Class<?> ...

    java中的反射reflect

    以下我们将深入探讨Java反射的基本概念、主要API以及如何通过给定的代码示例来理解反射的应用。 首先,让我们了解什么是类的反射。在Java中,`java.lang.Class` 类代表了运行时的类信息。我们可以通过一个类的全名...

    java基础,多线程,反射

    Java反射机制允许在运行时检查类、接口、字段和方法的信息,甚至可以在运行时动态创建对象并调用其方法。这为程序提供了极大的灵活性,特别是在框架开发和元编程中。通过`java.lang.Class`类和`java.lang.reflect`...

    JAVA反射详细讲解

    Java反射详解 在Java编程语言中,反射是一个强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,甚至能够在运行时创建和访问这些对象。这种能力使得Java成为一种动态语言,增强了代码的灵活性和可扩展...

    Java实验2 反射.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...

    实战java反射机制-让你迅速认识java强大的反射机制

    在反射中,由于类型擦除,泛型信息在运行时不可用。但可以通过方法签名或字段类型推断泛型的实际类型。 7. 注解与反射: 反射也可以用来读取类、方法、字段上的注解,帮助我们在运行时了解类的元数据信息。 8. ...

    JAVA基础JAVA中的反射机制详解.pdf

    Java反射机制是Java语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作。反射机制是基于Java的动态类型特性的,它使得Java具备了“元编程”的能力,即在运行时分析...

    Java反射机制 Java反射机制

    Java反射机制在JDK 1.1版本中就已经引入,但在JDK 1.5之后得到了进一步增强和完善,增加了泛型支持等功能,使得反射更加安全和强大。 #### 三、Java反射机制的核心概念与应用 1. **核心概念** - **Class对象**:...

    java反射机制基础

    java反射机制基础,是进入java反射机制的一把钥匙

    Java反射机制笔记(简单易懂)

    Java反射机制是Java语言中一个强大的功能,它允许程序在运行时检查和修改其自身的结构和行为。通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态地调用这些成员变量...

    java反射机制文档及代码

    在本资料"java反射机制文档及代码"中,详细介绍了Java反射的基础知识和常见应用。 首先,反射的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们可以获取到类的名称、包名、属性、构造器、...

    2020老杜最新Java零基础进阶视频教程-反射机制课件

    4. Java反射中的主要类和方法 - `Class`: 提供了获取类信息的各种方法,如`getConstructors()`获取构造方法,`getMethods()`获取所有的公共方法,`getFields()`获取公共字段等。 - `Constructor`: 表示类的构造方法...

    Java基础入门四泛型反射注解.pdf

    在Java基础入门四泛型、反射、注解的学习中,我们会了解到如何正确使用泛型来创建更加健壮的代码,如何利用反射机制实现类和对象的动态操作,以及如何利用注解来简化开发过程和提高代码的可读性。 此外,文档中提到...

    Java反射机制的学习

    要使用Java反射,首先需要获取到`Class`对象,这是反射操作的基础。以下是一些获取`Class`对象的方法: 1. `getClass()`:每个对象都有`getClass()`方法,可以直接获取对象所属的类的`Class`实例。 2. `Class....

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

Global site tag (gtag.js) - Google Analytics