java--反射常用方法(三)
【摘要】
java--反射常用方法(三)
一、Class中获取构造方法
Constructor类用于描述类中的构造方法:Constructor<T> getConstructor(Class<?>... parameterTypes)
返回该Class对象表示类的指定的public构造...
java--反射常用方法(三)
一、Class中获取构造方法
- Constructor类用于描述类中的构造方法:
- Constructor<T> getConstructor(Class<?>... parameterTypes)
返回该Class对象表示类的指定的public构造方法;
- Constructor<?>[] getConstructors()
返回该Class对象表示类的所有public构造方法;
- Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回该Class对象表示类的指定的构造方法,和访问权限无关;
- Constructor<?>[] getDeclaredConstructors()
返回该Class对象表示类的所有构造方法,和访问权限无关;
Class中获取构造方法实例
-
package reflect;
-
-
import java.lang.reflect.Constructor;
-
import java.util.Date;
-
-
class Person {
-
//没有使用public修饰的类的默认构造器的访问修饰符是啥?
-
//一个类的默认的构造器的访问权限和类的访问权限一致;
-
}
-
-
public class ConstructorDemo {
-
public static void main(String[] args) throws Exception {
-
-
// 得到Person里所有公共的构造器
-
// 先得到Person的字节码
-
-
Class<Dept> clz = Dept.class;
-
// 获得Person里所有public的构造器
-
Constructor<?>[] cs = clz.getConstructors();//只能获得公共 的构造器
-
//Constructor<?>[] cs = clz.getDeclaredConstructors();//所有的构造器
-
System.out.println(cs.length);
-
for (Constructor<?> c : cs) {
-
System.out.println(c);
-
}
-
-
//===========================================
-
//获得指定的构造器 protected Dept(int age)
-
-
/**
-
* Constructor<T> getConstructor(Class<?>... parameterTypes)
-
获得Class所表示类的指定的public修饰的构造器;
-
-
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
-
获得Class所表示类的指定的构造器,和访问权限无关;
-
-
*/
-
-
//Constructor<Dept> con = clz.getConstructor(int.class);
-
Constructor<Dept> con = clz.getDeclaredConstructor(int.class);
-
System.out.println("-->"+con);
-
-
//获得 private Dept()
-
-
con = clz.getDeclaredConstructor();
-
System.out.println(con);
-
-
//获得protected Dept(int age,Date d)
-
-
con = clz.getDeclaredConstructor(int.class,Date.class);
-
System.out.println(con);
-
-
}
-
}
二、Class获取Method
- Method类用于描述类中的方法:
- Method getMethod(String name, Class<?> ... parameterTypes)
返回该Class对象表示类和其父类的指定的public方法;
- Method[] getMethods():
返回该Class对象表示类和其父类的所有public方法;
- Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回该Class对象表示类的指定的方法。和访问权限无关,但不包括继承的方法;
- Method[] getDeclaredMethods(): 获得类所有的方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法;
Class获取Method实例
-
package reflect;
-
-
import java.lang.reflect.Method;
-
import java.lang.reflect.Modifier;
-
import java.util.Date;
-
import java.util.List;
-
-
class Sub extends Object {
-
-
private void show1() {
-
}
-
-
void show2() {
-
}
-
-
protected void show3() {
-
}
-
-
public void show4() {
-
}
-
-
-
@Deprecated
-
public void ooxx(byte[] bys, int age, Integer i1, String name, Date bornDate){}
-
}
-
-
public class MethodDemo {
-
public static void main(String[] args) throws Exception {
-
-
// 得到Object里所有的public修饰的方法
-
-
Class<Sub> clz = Sub.class;
-
/**
-
* Method[] getMethods() 得到Class所表示类的所有的public修饰的方法,包括继承过来的方法 Method[]
-
* getDeclaredMethods() 和访问权限无关,不包括继承过来的的方法
-
*/
-
-
// Method[] ms = clz.getMethods();
-
Method[] ms = clz.getDeclaredMethods();
-
for (Method m : ms) {
-
System.out.println(m);
-
}
-
-
System.out.println("-0--------------------------");
-
//获得指定的方法;
-
-
/**
-
* Method getMethod(String methodName, Class<?>... parameterTypes) :public修饰的方法
-
* Method getDeclaredMethod(String methodName, Class<?>... parameterTypes) 和权限无关,不包括继承的
-
*/
-
-
//只获得protected void show3()
-
-
Method m = clz.getDeclaredMethod("show3");
-
System.out.println(m);
-
-
//获得public void ooxx(byte[] bys, int age, Integer i1, String name, Date bornDate)
-
-
m = clz.getMethod("ooxx", byte[].class, int.class,Integer.class,String.class,Date.class);
-
-
System.out.println(m);
-
System.out.println(m.getName());
-
System.out.println(Modifier.toString(m.getModifiers()));
-
System.out.println(m.getReturnType());
-
-
//Arrays: 得到 public static <T> List<T> asList(T... a)
-
}
-
}
三、Class中获取Field
- Field类用于描述类中的字段:
- Field getField(String name)
返回该Class对象表示类和其父类的指定的public字段;
- Field[] getFields()
返回该Class对象表示类和其父类的所有public字段;
- Field getDeclaredField(String name)
返回该Class对象表示类的指定的字段和访问权限无关,但不包括继承的字段;
- Field[] getDeclaredFields()
返回当前Class对象中公共、保护、默认(包)访问和私有字段,但不包括继承的字段;
Class中获取Field实例
-
package reflect;
-
-
import java.lang.annotation.Annotation;
-
import java.lang.reflect.Field;
-
import java.lang.reflect.Modifier;
-
import java.util.Date;
-
-
class People{
-
public String name;
-
}
-
-
class Student extends People{
-
-
@Deprecated
-
private int age;
-
public Date bornDate;
-
}
-
public class FieldDemo {
-
public static void main(String[] args) throws Exception {
-
-
Class<Student> clz = Student.class;
-
-
/**
-
* Field[] getFields() : 得到Class所表示类的所有的public修饰的字段,包括继承的
-
* Field[] getDeclaredFields() : 得到Class所表示类的所有的字段和访问权限无关,不包括继承的
-
*/
-
-
//Field[] fs = clz.getFields();
-
Field[] fs = clz.getDeclaredFields();
-
for (Field field : fs) {
-
System.out.println(field);
-
}
-
-
System.out.println("--------------------------");
-
/**
-
* 获得指定的一个字段:
-
* Field getField(String filedName) : 得到Class所表示类的所有的public修饰的字段,包括继承的
-
* Field getDeclaredField(String fileName) : 得到Class所表示类的所有的字段和访问权限无关,不包括继承的
-
*/
-
-
Field f = clz.getDeclaredField("age");
-
System.out.println(f.toString());
-
System.out.println(Modifier.toString(f.getModifiers()));
-
System.out.println(f.getType());
-
System.out.println(f.getName());
-
-
Annotation[] as = f.getDeclaredAnnotations();
-
for (Annotation a : as) {
-
System.out.println(a);
-
}
-
}
-
}
四、Class常用方法
-
package reflect;
-
-
import java.io.Serializable;
-
import java.lang.reflect.Modifier;
-
import java.util.Date;
-
import java.util.Map;
-
-
@Deprecated//表示过时
-
class Emp implements Serializable,Comparable<Emp>{
-
-
-
private class A{
-
}
-
class B{
-
}
-
public int compareTo(Emp o) {
-
return 0;
-
}
-
}
-
-
-
public class ClassCommonMethodDemo {
-
public static void main(String[] args) {
-
-
//获得Emp类里的信息//Date
-
-
Class<Emp> clz = Emp.class;
-
-
-
/**
-
* Annotation[] getAnnotations() 返回此元素上存在的所有注释。
-
*/
-
-
System.out.println(clz.getAnnotations().length);
-
-
/**
-
* Class<?>[] getClasses()
-
得到Class所描述类的所有的public修饰的内部类
-
-
Class<?> getDeclaredClasses()
-
得到Class所描述类的所有的内部类,和访问权限无关
-
*/
-
-
//Class<?>[] innerClass = clz.getClasses();
-
Class<?>[] innerClass = clz.getDeclaredClasses();
-
System.out.println(innerClass.length);
-
for (Class<?> c : innerClass) {
-
System.out.println(c);
-
}
-
-
/**
-
* Class<?>[] getInterfaces() 确定此对象所表示的类或接口实现的接口。
-
*/
-
-
System.out.println("接口 "+clz.getInterfaces().length);
-
-
/**
-
* int getModifiers() 返回此类或接口以整数编码的 Java 语言修饰符。
-
*/
-
-
/**
-
* Modifier:
-
* static String toString(int mod) 返回描述指定修饰符中的访问修饰符标志的字符串。
-
*/
-
-
Class<Date> clzDate = Date.class;
-
System.out.println(clzDate.getModifiers());//1
-
System.out.println(Modifier.toString(clzDate.getModifiers()));//public
-
-
/**
-
* String getName() 返回Class所描述类的全限定名
-
* String getSimpleName() 返回源代码中给出的底层类的简称。
-
*/
-
-
System.out.println(clz.getName());//reflect.Emp
-
System.out.println(clz.getSimpleName());//Emp
-
-
/**
-
* Package getPackage() 获取此类的包。
-
*/
-
-
System.out.println(clz.getPackage());
-
/**
-
* Class<? super T> getSuperclass()
-
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
-
*/
-
-
System.out.println("clz.getSuperclass()= " +clz.getSuperclass());
-
-
System.out.println(String.class.isArray());//false
-
System.out.println(String[].class.isArray());//true
-
-
System.out.println(Map.class.isInterface());
-
System.out.println(Gender.class.isEnum());
-
System.out.println(int[].class.isPrimitive());//
-
System.out.println(int.class.isPrimitive());
-
-
System.out.println(Deprecated.class.isAnnotation());
-
/**
-
* <U> Class<? extends U> asSubclass(Class<U> clazz)
-
强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。
-
*/
-
-
Object obj = new Date();
-
-
Class<Date> d = (Class<Date>) obj.getClass().asSubclass(Date.class);
-
System.out.println(d);
-
-
/**
-
* boolean isInstance(Object obj)
-
判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
-
-
对象 instanceof 类
-
*/
-
-
System.out.println("-->"+obj.getClass());//Date d = new Date();
-
boolean b = Object.class.isInstance(new Date());
-
System.out.println(b);//true
-
-
System.out.println(Date.class.isInstance(obj));
-
}
-
}
五、Class创建对象
创建对象:
- 使用Class对象的newInstance()方法创建该Class对象的实例,此时该Class对象必须要有无参数的构造方法。
- 使用Class对象获取指定的Constructor对象,再调用Constructor的newInstance()方法创建对象类的实例,此时可以选择使用某个构造方法。
创建对象实例
-
package reflect;
-
-
import java.lang.reflect.Constructor;
-
import java.util.Date;
-
-
class Teacher{
-
-
private Teacher(String name){
-
System.out.println(name);
-
}
-
public String toString() {
-
return "老师";
-
}
-
}
-
public class NewInstanceDemo {
-
public static void main(String[] args) throws Exception {
-
-
// Teacher t = new Teacher();
-
//System.out.println(t);
-
-
/**使用反射来创建对象
-
* 1.
-
* public T newInstance():只能创建非private,无参的构造方法的对象;好比 new 类();
-
* T classInstance.newIntance();
-
* 如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。
-
*
-
* 2.
-
* 1>.先得到一个指定的构造方法,
-
* 2>.调用构造器里的一个方法,
-
* T newInstance(Object... initargs) 、
-
* initargs表示构造器的需要的实际参数
-
*/
-
-
Class<Teacher> clz = Teacher.class;
-
-
//Teacher t2 = clz.newInstance();
-
//System.out.println(t2);
-
// System.out.println(t == t2);//false
-
-
//调用有参的私有构造方法
-
Constructor<Teacher> con = clz.getDeclaredConstructor(String.class);
-
-
/**
-
* 访问私有的成员之前:先设置其为可访问的
-
*
-
* AccessibleObject: 表示可访问的对象,是Contructor,Method,Filed的父类;
-
* 方法: void setAccessible(boolean flag) :用来设置是否可访问的
-
-
-
若要设置可访问的:
-
obj.setAccessible(true);
-
*/
-
-
con.setAccessible(true);//设置可访问的
-
Teacher t = con.newInstance("will");
-
System.out.println(t);
-
-
//===========================
-
System.out.println("------------------");
-
createInstance();
-
}
-
-
//使用反射来创建java.util.Date的对象
-
public static void createInstance() throws Exception{
-
-
//new Date();
-
Class<?> clz = Class.forName("java.util.Date");
-
-
Date d = (Date) clz.newInstance();
-
System.out.println(d);
-
-
//
-
Constructor<Date> con = (Constructor<Date>) clz.getConstructor();
-
System.out.println(con.newInstance());
-
-
//new Date(long time);
-
-
con = (Constructor<Date>) clz.getConstructor(long.class);
-
System.out.println(con.newInstance(1));
-
}
-
}
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/80105073
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)