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程序对自身进行检查并且可以直接操作程序的内部属性。...提供的"Java反射示例代码.rar"资源正好可以帮助初学者通过实践来理解这些概念。
以下是一个使用Java反射的简单示例,展示了如何通过反射获取`java.util.Stack`类的所有方法: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String[] args) { try ...
### JAVA-提高反射效率 #### 一、反射技术概述 反射是Java中一项强大的功能,它允许程序在运行时检查类、接口、字段和方法的信息,并且可以动态地调用方法或修改字段值。这种能力使得Java程序具有高度的灵活性和可...
在"java类反射示例源码"中,我们可以深入理解这个概念并学习如何在实际开发中应用。 反射的使用通常涉及到以下关键知识点: 1. **Class类**: 在Java中,`java.lang.Class`类是所有类的通用表示,每个类都有一个与...
Java编程语言以其强大的功能和广泛的应用领域而备受程序员喜爱,其中反射和代理是两个非常重要的概念,它们在实际开发中有着广泛的应用。本资源“浪曦经典Java代码--反射+代理reflection_proxy源码”提供了深入理解...
下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0])...
Java反射机制是Java编程语言中的一个核心特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这种能力使得Java开发者能够在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用...
配合文档中的实例和示例代码,读者可以更深入地理解和掌握Java反射的精髓。 总结起来,Java反射是Java语言的一个重要特性,它提供了对运行时类信息的访问和操作能力,极大地增强了代码的灵活性和可扩展性。然而,...
通过"learn-java-master"项目,你可以系统地学习和复习这些Java知识点,结合实际的代码示例和练习,将极大地提升你的Java技能。记得实践是检验知识最好的标准,理论与实践相结合,才能真正掌握这些知识。
《高级Java编程实例详解》是一份宝贵的资源,包含了大量的Java源代码示例,这些示例源自书籍中的教学内容,同时也代表了大型企业级项目的实践应用。这个压缩包"adv-java-examples.zip"提供了丰富的学习材料,无需...
这个压缩包中的"java-ee-master"可能是包含了一些示例项目或者练习代码,这些代码可以帮助你在实际操作中学习Java-EE。你可以通过阅读和修改这些代码来提升编程技巧,理解如何将不同Java-EE组件整合到一起,如使用...
这个"Java的反射demo示例"很可能是包含了一些关于如何使用反射进行编程的代码实例。 反射的核心功能包括以下几点: 1. **获取类信息**:通过Class对象,我们可以获取到类的完整名称、类的属性、方法和构造器等信息...
4. **反射**:Java反射机制允许程序在运行时动态地获取类的信息并调用其方法,源码中可能涉及类、接口、构造函数和方法的反射操作。 5. **注解(Annotation)**:源码可能包含自定义注解和元注解的使用,以及如何通过...
以下是对这个“最简单Java反射原理示例”的详细解释。 一、Java反射的概念 Java反射机制允许我们在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用这些方法。这是通过`java.lang.Class`类和相关API...
Java3D API文档通常包含了详细的类、接口、方法和常量的说明,以及示例代码,帮助开发者理解如何使用这些工具来构建3D场景。 标签进一步强调了这个资源的关键点:"3D"、"java"、"帮助文档"、"java3D"和"帮助文档",...
Java反射机制是Java编程语言中...通过实际的代码示例,学习和理解Java反射机制将变得更加直观和深入。在实际开发中,反射常用于框架、插件系统、序列化/反序列化、测试等方面,但也需要谨慎使用,避免过度依赖和滥用。
Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在深入理解Java反射之前,我们首先要明白面向对象的基本概念,包括类、对象、方法以及...