Class对象、反射机制、获取Constructor构造方法
1、Class对象的三种创建方法(Class首字母大写)
public class Demo { public static void main(String[] args){ Object obj=new Object();//方法一:先new对象,再调用方法,创建Class对象c1 Class c1=obj.getClass(); Class c2=Object.class;//方法二:使用.class属性,无需new对象,直接创建Class对象c2 try { //方法三(推荐):调用Class类的forName方法,不需考虑类是否存在,功能强大。 Class c3=Class.forName("java.lang.Object"); System.out.println("c3哈希值:"+c3.hashCode());//哈希值判断是否指向同一对象 } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("c1哈希值:"+c1.hashCode()); System.out.println("c2哈希值:"+c2.hashCode()); } }
Class对象的价值:反射机制。
Class对象可以看作某个类的影子,通过影子,可以获得这个类的方法、属性等。
如下案例中,Demo.java中的Class对象c是Example.java的影子。通过c,获得Examp中的方法类型、参数类型等。
2、获得Constructor构造方法(java.lang.reflect.Constructor包下)
class.getConstructors() 获取所有公有public构造方法。()内带参数,则获取指定的public构造方法。
class.getDeclaredConstructors() 获取所有构造方法。()内带参数,则获取指定构造方法。
构造方法Constructor的一些属性:getModifiers修饰符、getName名字、getParameterTypes参数类型
public class Demo { public static void main(String[] args) { try { Class c = Class.forName("Example");//创建类对象。同一包下,直接使用 Constructor cons[] = c.getDeclaredConstructors();//获取Example中的所有构造方法 for (Constructor con : cons) {//con.getModifiers()返回Int型,所以转字符串 System.out.print(Modifier.toString(con.getModifiers()) + " ");//获取修饰符 System.out.println(con.getName());//方法名 Class paras[] = con.getParameterTypes();//方法中的参数类型 for (int i = 0; i < paras.length; i++) { System.out.println(paras[i].getSimpleName());//参数类型的简化名 } } //无参数的构造方法。Example中toString Constructor cs1 = c.getDeclaredConstructor();//Example中无参数的构造方法 Object obj = cs1.newInstance();//实例化 System.out.println(obj.toString());//调用Example中toString方法 //1个参数的构造方法。Example中id赋值123 Constructor cs2 = c.getDeclaredConstructor(int.class);//Example中int型参数的构造方法 obj = cs2.newInstance(123);//实例化 System.out.println(obj.toString());//调用Example中toString方法 //3个参数的构造方法。Example中id、name、price赋值 Constructor cs3 = c.getDeclaredConstructor(int.class, String.class, double.class);//Example中3参数的构造方法 cs3.setAccessible(true);//private私有方法无法使用,故获取权限 obj = cs3.newInstance(123, "反射", 3.14);//实例化 System.out.println(obj.toString());//调用Example中toString方法 } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
public class Example { int id; String name; double price; //Alt+Insert,Constructor快速创建构造方法 public Example() { } public Example(int id) { this.id = id; } private Example(int id, String name, double price) { this.id = id; this.name = name; this.price = price; } //Alt+Insert,toString快速创建构造方法 public String toString() {//返回Example的值 return "Example{" + "id=" + id + ", name='" + name + '\'' + ", price=" + price + '}'; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!