`

java-反射示例

    博客分类:
  • java
阅读更多
package cd.itcast.day1;

import java.lang.reflect.Constructor;

/**
 * 反射:就是得到类型的描述实例
 * 
 * @author Administrator
 * 
 * 练习:
 * ReflectDemo cd.itcast.day1.User
 * 任意传入一个类型,解析这个类型的结构
 * 
 * 1,Class c=Class.forName(args[0]);
 * 2,getPackage();
 * 3,getSimpleName();
 * 4,getDeclearFields();
 * 5,getDeclareConstrcutors();
 * 6,getDeclareMethods();
 */
public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		/**
		 * Class:是所有类(接口)的描述 得到一个类型的描述有三种方式 1,通过类型.class得到 2,通过类型的实例得到
		 * 3,通过类的全限定名得到类型
		 * 
		 * 直接使用类型.class没有执行类的静态代码快
		 */
		// Class c=User.class;
		// System.out.println(c);

		// User u=new User();
		// Class c=u.getClass();
		// System.out.println(c);
		Class<?> c = Class.forName("cd.itcast.day1.User");
		// test(c);
		// test2();
		/**
		 * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
		 * 在反射里面,得到构造方法,方法,字段都有两对方法, getXXX:代表的这个类上面能得到的所有的(包括从父类继承的)public的XXX
		 * getDeclaredXXX:代表的是这个类里面自己声明的所有的 XXX
		 * 
		 */
		// test3(c);
		test4(c);
		
		System.out.println(c.getName());
		System.out.println(c.getSimpleName());
		
		Class c2=User.class;
		/**
		 * 判断给定的类是否是当前类的子类
		 * 给定的类:参数中的类
		 * 当前的类:调用isAssignableFrom方法的类
		 */
		System.out.println(c2.isAssignableFrom(Employee.class));
		
		System.out.println(c2.newInstance());
		
		Class c3=Domain.class;
		Constructor con=c3.getDeclaredConstructors()[0];
		con.setAccessible(true);
		System.out.println(con.newInstance());
	}

	/**
	 * 方法
	 */
	private static void test4(Class<?> c) throws Exception {
		Method[] ms=c.getDeclaredMethods();
		System.out.println(Arrays.toString(ms));
		
		Method m=c.getDeclaredMethod("getName");
		System.out.println(m);
		
		Method setter=c.getDeclaredMethod("setName",String.class);
		
		User u=new User();
		setter.invoke(u, "xxx");
		
		String s=(String)m.invoke(u);
		System.out.println(s);
		
		Method staticm=c.getDeclaredMethod("getDefaultName");
		System.out.println(staticm);
		
		//执行静态方法
		String ret=(String)staticm.invoke(null);
		System.out.println(ret);
	}

	/**
	 * 得到字段
	 * 
	 * @param c
	 * @throws Exception
	 */
	private static void test3(Class<?> c) throws Exception {
		Field[] fs = c.getFields();
		System.out.println(Arrays.toString(fs));

		User u = new User();

		Field f = c.getDeclaredField("name");
		/**
		 * 获取私有字段赋值权限.私有字段不能直接赋值,需要调用setAccessible方法.
		 */
		f.setAccessible(true);
		f.set(u, "aaaa");

		System.out.println(u.getName());
	}

	private static void test2() throws Exception {
		Class<User> uc = User.class;
		Constructor<User> c = uc.getConstructor();
		User u = c.newInstance();
		System.out.println(u);
	}

	private static void test(Class<?> c) throws Exception {
		// 得到类的所有构造器
		Constructor<?>[] cs = c.getConstructors();
		System.out.println(Arrays.toString(cs));
		// 报错:NoSuchMethodException
		Constructor<?> cc = c.getConstructor(Long.class, String.class);
		System.out.println(cc);

		/**
		 * Constructor用来描述构造方法的类型
		 */
		int i = cc.getModifiers();
		System.out.println(i);

		System.out.println(cc.getName());

		// 得到参数的类型列表
		System.out.println(Arrays.toString(cc.getParameterTypes()));

		// 使用构造方法创建这个类的实例
		Object o = cc.newInstance(20l, "abc");
		User u = (User) o;
		System.out.println(u.getName());
	}
}
分享到:
评论

相关推荐

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射...以上内容不仅解释了Java反射机制的相关知识点,还通过示例代码进行了实践演示,希望能够帮助你在Java面试中更好地理解和运用这一重要特性。

    java反射示例代码

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在Java中,反射主要用于以下场景:代码生成、元数据访问、插件系统、框架设计等。...

    Java反射示例代码.rar

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...提供的"Java反射示例代码.rar"资源正好可以帮助初学者通过实践来理解这些概念。

    java专题-反射

    以下是一个使用Java反射的简单示例,展示了如何通过反射获取`java.util.Stack`类的所有方法: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String[] args) { try ...

    JAVA-提高反射效率

    ### JAVA-提高反射效率 #### 一、反射技术概述 反射是Java中一项强大的功能,它允许程序在运行时检查类、接口、字段和方法的信息,并且可以动态地调用方法或修改字段值。这种能力使得Java程序具有高度的灵活性和可...

    java类反射示例源码

    在"java类反射示例源码"中,我们可以深入理解这个概念并学习如何在实际开发中应用。 反射的使用通常涉及到以下关键知识点: 1. **Class类**: 在Java中,`java.lang.Class`类是所有类的通用表示,每个类都有一个与...

    浪曦经典Java代码--反射+代理reflection_proxy源码

    Java编程语言以其强大的功能和广泛的应用领域而备受程序员喜爱,其中反射和代理是两个非常重要的概念,它们在实际开发中有着广泛的应用。本资源“浪曦经典Java代码--反射+代理reflection_proxy源码”提供了深入理解...

    反射实例-JAVA反射机制

    下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0])...

    java-fanshejizhi.rar_java 反射

    Java反射机制是Java编程语言中的一个核心特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这种能力使得Java开发者能够在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用...

    java-reflection-Xiangjie.rar_java 反射

    配合文档中的实例和示例代码,读者可以更深入地理解和掌握Java反射的精髓。 总结起来,Java反射是Java语言的一个重要特性,它提供了对运行时类信息的访问和操作能力,极大地增强了代码的灵活性和可扩展性。然而,...

    learn-java-master_java_知识点_

    通过"learn-java-master"项目,你可以系统地学习和复习这些Java知识点,结合实际的代码示例和练习,将极大地提升你的Java技能。记得实践是检验知识最好的标准,理论与实践相结合,才能真正掌握这些知识。

    adv-java-examples.zip_adv-java-examples_大项目

    《高级Java编程实例详解》是一份宝贵的资源,包含了大量的Java源代码示例,这些示例源自书籍中的教学内容,同时也代表了大型企业级项目的实践应用。这个压缩包"adv-java-examples.zip"提供了丰富的学习材料,无需...

    Java学习资料、java-ee课堂作业 自学练习代码

    这个压缩包中的"java-ee-master"可能是包含了一些示例项目或者练习代码,这些代码可以帮助你在实际操作中学习Java-EE。你可以通过阅读和修改这些代码来提升编程技巧,理解如何将不同Java-EE组件整合到一起,如使用...

    Java的反射demo示例

    这个"Java的反射demo示例"很可能是包含了一些关于如何使用反射进行编程的代码实例。 反射的核心功能包括以下几点: 1. **获取类信息**:通过Class对象,我们可以获取到类的完整名称、类的属性、方法和构造器等信息...

    java72-java-advance源代码.zip

    4. **反射**:Java反射机制允许程序在运行时动态地获取类的信息并调用其方法,源码中可能涉及类、接口、构造函数和方法的反射操作。 5. **注解(Annotation)**:源码可能包含自定义注解和元注解的使用,以及如何通过...

    最简单java 反射原理示例

    以下是对这个“最简单Java反射原理示例”的详细解释。 一、Java反射的概念 Java反射机制允许我们在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用这些方法。这是通过`java.lang.Class`类和相关API...

    java3d-1_5_1-api-docs.zip

    Java3D API文档通常包含了详细的类、接口、方法和常量的说明,以及示例代码,帮助开发者理解如何使用这些工具来构建3D场景。 标签进一步强调了这个资源的关键点:"3D"、"java"、"帮助文档"、"java3D"和"帮助文档",...

    java反射机制+代码示例

    Java反射机制是Java编程语言中...通过实际的代码示例,学习和理解Java反射机制将变得更加直观和深入。在实际开发中,反射常用于框架、插件系统、序列化/反序列化、测试等方面,但也需要谨慎使用,避免过度依赖和滥用。

    Java基础之-反射(非常重要)

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在深入理解Java反射之前,我们首先要明白面向对象的基本概念,包括类、对象、方法以及...

Global site tag (gtag.js) - Google Analytics