Java 反射:Class类,动态加载类获取方法和成员变量构造信息,方法反射的基本 *** 作,集合泛型的本质

Java 反射:Class类,动态加载类获取方法和成员变量构造信息,方法反射的基本 *** 作,集合泛型的本质,第1张

Java 反射:Class类,动态加载类获取方法和成员变量构造信息,方法反射的基本 *** 作,集合泛型的本质

import java.lang.reflect.Method;

public class ClassUtil {

 
 
public static void printClassMethodMessage(Object obj){
  //要获取类的信息  首先要获取类的类类型
  Class c = obj.getClass();//传递的是哪个子类的对象  c就是该子类的类类型
  //获取类的名称
  System.out.println("类的名称是:"+c.getName());
  
  Method[] ms = c.getMethods();//c.getDeclaredMethods()
  for(int i = 0; i < ms.length;i++){
  	//得到方法的返回值类型的类类型
  	Class returnType = ms[i].getReturnType();
  	System.out.print(returnType.getName()+" ");
  	//得到方法的名称
  	System.out.print(ms[i].getName()+"(");
  	//获取参数类型--->得到的是参数列表的类型的类类型
  	Class[] paramTypes = ms[i].getParameterTypes();
  	for (Class class1 : paramTypes) {
  		System.out.print(class1.getName()+",");
  	}
  	System.out.println(")");
  }
}
 
 
public static void printFieldMessage(Object obj) {
  Class c = obj.getClass();
  
  //Field[] fs = c.getFields();
  Field[] fs = c.getDeclaredFields();
  for (Field field : fs) {
  	//得到成员变量的类型的类类型
  	Class fieldType = field.getType();
  	String typeName = fieldType.getName();
  	//得到成员变量的名称
  	String fieldName = field.getName();
  	System.out.println(typeName+" "+fieldName);
  }
}
 
 
public static void printConMessage(Object obj){
  Class c = obj.getClass();
  
  //Constructor[] cs = c.getConstructors();
  Constructor[] cs = c.getDeclaredConstructors();
  for (Constructor constructor : cs) {
  	System.out.print(constructor.getName()+"(");
  	//获取构造函数的参数列表--->得到的是参数列表的类类型
  	Class[] paramTypes = constructor.getParameterTypes();
  	for (Class class1 : paramTypes) {
  		System.out.print(class1.getName()+",");
  	}
  	System.out.println(")");
  }
}

}

MethodDemo:

===========

MethodDemo1.java


import java.lang.reflect.Method;

public class MethodDemo1 {

public static void main(String[] args) {
 //要获取print(int ,int )方法  1.要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型
  A a1 = new A();
  Class c = a1.getClass();
  
  try {
  	//Method m =  c.getMethod("print", new Class[]{int.class,int.class});
  	Method m = c.getMethod("print", int.class,int.class);
  	//方法的反射 *** 作  
  	//a1.print(10, 20);方法的反射 *** 作是用m对象来进行方法调用 和a1.print调用的效果完全相同
      //方法如果没有返回值返回null,有返回值返回具体的返回值
  	//Object o = m.invoke(a1,new Object[]{10,20});
  	Object o = m.invoke(a1, 10,20);
  	System.out.println("==================");
  	//获取方法print(String,String)
         Method m1 = c.getMethod("print",String.class,String.class);
         //用方法进行反射 *** 作
         //a1.print("hello", "WORLD");
         o = m1.invoke(a1, "hello","WORLD");
         System.out.println("===================");
       //  Method m2 = c.getMethod("print", new Class[]{});
            Method m2 = c.getMethod("print");
           // m2.invoke(a1, new Object[]{});
            m2.invoke(a1);
  } catch (Exception e) {
  	// TODO Auto-generated catch block
  	e.printStackTrace();
  } 
}

}

class A{

public void print(){
  System.out.println("helloworld");
}
public void print(int a,int b){
  System.out.println(a+b);
}
public void print(String a,String b){
  System.out.println(a.toUpperCase()+","+b.toLowerCase());
}

}

MethodDemo2.java


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.lang.reflect.Method;

public class MethodDemo2 {

public static void main(String[] args) {
  UserService us = new UserService();
  
  try {
  	BufferedReader br = new BufferedReader(
  			new InputStreamReader(System.in));
  	System.out.println("请输入命令:");
  	String action = br.readLine();
  	
  	
  	Class c = us.getClass();
  	Method m = c.getMethod(action);
  	m.invoke(us);
  } catch (Exception e) {
  	e.printStackTrace();
  }
}

}

MethodDemo3.java


public class MethodDemo3 {

 
 
public static void main(String[] args) {
  // TODO Auto-generated method stub
  User u1 = new User("zhangsan", "123456", 30);
  System.out.println(BeanUtil.getValueByPropertyName(u1, "username"));
   System.out.println(BeanUtil.getValueByPropertyName(u1, "userpass"));
}

}

MethodDemo4.java


import java.lang.reflect.Method;

import java.util.ArrayList;

public class MethodDemo4 {

public static void main(String[] args) {
  ArrayList list = new ArrayList();
  ArrayList list1 = new ArrayList();
  list1.add("hello");
  //list1.add(20);错误的
  Class c1 = list.getClass();
  Class c2 = list1.getClass();
  System.out.println(c1 == c2);
  //反射的 *** 作都是编译之后的 *** 作
  
  try {
  	Method m = c2.getMethod("add", Object.class);
  	m.invoke(list1, 20);//绕过编译 *** 作就绕过了泛型
  	System.out.println(list1.size());
  	System.out.println(list1);
  	//现在不能这样遍历
  } catch (Exception e) {
    e.printStackTrace();
  }
}

}

JavaBean:

=========

User.java


//标准的JavaBean类有私有属性都对应有get/set方法,有无参数的构造方法

public class User {

private String username;
private String userpass;
private int age;

如果你进阶的路上缺乏方向,可以点击我的【Github】加入我们的圈子和安卓开发者们一起学习交流!
以下全部内容都可以在GitHub中获取!

Android进阶学习全套手册

Android对标阿里P7学习视频

BATJ大厂Android高频面试题

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)加入我们的圈子和安卓开发者们一起学习交流!**
以下全部内容都可以在GitHub中获取!

Android进阶学习全套手册

[外链图片转存中…(img-nQRSjfkA-1643958773371)]

Android对标阿里P7学习视频

[外链图片转存中…(img-i4WJfpJ7-1643958773372)]

BATJ大厂Android高频面试题

[外链图片转存中…(img-QKEIn8w6-1643958773372)]

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5722463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存