首页 > 编程语言 >学习Java的第十一天啦(2024.7.26)

学习Java的第十一天啦(2024.7.26)

时间:2024-07-26 20:55:42浏览次数:16  
标签:第十一天 Class 26 Java String name 获取 public 属性

1.死锁的条件:

死锁的产生还涉及到一些具体的条件,这些条件可以被看作是死锁产生的必要条件,包括:
1.互斥条件:资源不能被多个进程或线程同时访问,即资源是互斥的。
2.请求保持条件:进程或线程在请求资源时,已经持有其他资源,并且不愿意释放已经持有的资源。
3.不可剥夺条件:已经分配给进程或线程的资源,在未使用完之前不能被其他进程或线程剥夺。
4.循环等待条件:多个进程或线程之间形成一个循环等待链,每个进程或线程都在等待链中下一个进程或线程释放资源。

2.反射的概念:

程序运行期间,可以动态地获取类的内容(属性/方法/构造方法)的机制(思想),这种机制的实现称作反射。

解释:

Java语言是面向对象的,有对象必须先有类,在Java中存储了类的内容,这个内容也是一个对象。Java中的每一个类都有单独的内存,所以每一个类的内存都是一个对象,这些对象用来记录这些类中声明了哪些属性、方法、构造方法。

Java将这些类抽象为一个类:Class类

Class类的对象是不能new出来的,要用下面三种方法创建Class类对象:

1.通过类名的方式创建Class类对象

public class EasyClassA {
    public static void main(String[] args) {
        //通过类名获取类的类对象
        Class clazz = EasyClassA.class;
        System.out.println(clazz);
    }
}

2.通过对象获取类对象

public class EasyClassA {
    public static void main(String[] args) {
        //通过对象获取类对象
        Class clazz = new EasyClassA().getClass();
        System.out.println(clazz);
    }
}

3.通过Class方法的forName方法获取;

public class EasyClassA {
    public static void main(String[] args) {
        //通过Class方法的forName方法获取
        try {
           Class clazz = Class.forName("com.easy0725.EasyColor");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        System.out.println(clazz);
    }
}

3.Class类中记录类属性的对象的类是FIeld类

先创建一个Easy类:

public class Easy {
    public String name;
    protected String code;
    String sex;
    private String address;
    static int maxAge;
    public static volatile  String test=null;

    public Easy(){}
    public Easy(String name){
        this.name=name;
    }
    public void methodA(){
        System.out.println("methodA");
    }
    public void methodB(int a,int b){
        System.out.println("methodB");
        System.out.println("两个参数分别为:"+a+","+b);
    }
}

fName变量指向的对象就是Easy类中的name属性:

public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //获取类对象
        Class c = Easy.class;
        //获取类的属性
        //Java中用来记录类的属性的类叫做Field
        //fName变量指向的对象就是Easy类中的name属性
        Field fName=c.getField("name");
        //可以通过fName获取某一个Easy类的对象的name属性的值

        Easy easy=new Easy();
        easy.name="张三";
        System.out.println(easy.name);//输出:张三
        //可以通过fName获取某一个Easy类的对象的name属性的值
        Object objectName=fName.get(easy);
        System.out.println(objectName+"-----------");//输出:张三------------
        //可以通过fName注入某一个Easy类的对象的name属性的值
        fName.set(easy,"李四");
        System.out.println(easy.name);
    }

getField()和getFields() 只能获取类中的public声明的属性

getDeclaredField()方法和getDeclaredFields()方法可以获取别的类型的值(protected、default)

        //getField和getFields 只能获取类中的public声明的属性
        Field fCode=c.getDeclaredField("code");//使用getDeclaredField方法可以获取别的类型的值
        fCode.set(easy,"10000");
        Object objectCode=fCode.get(easy);//通过反射获取easy对象的code属性的值
        System.out.println(objectCode);

访问private的属性时要先获取访问权限

        Field fSex=c.getDeclaredField("sex");
        Field fAddress=c.getDeclaredField("address");
        fSex.set(easy,"女");

        //反射访问私有属性  必须先获取访问权限
        fAddress.setAccessible(true);//将访问权限设置为true,就可以访问了
        fAddress.set(easy,"青岛");
        System.out.println(fAddress.get(easy));

4.通过键值对存储在Map中的实例:

先创建一个学生类:

class Student{
    private String name;
    private String code;
    private String sex;
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", code='" + code + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

利用泛型,创建一个方法:

public class EasyClassC {
    public static <T> T getInstance(Class<T>  tClass, Map values) throws InstantiationException, IllegalAccessException {
        //通过反射获取实例   创建对象
        T t=tClass.newInstance();//通过类中的无参构造方法创建对象
        //通过反射获取类中定义的属性
        Field[] farr=tClass.getDeclaredFields();
        //System.out.println(Arrays.toString(farr));
        for (Field fitem:farr){
            //获取属性的名字
            String fname=fitem.getName();//获取属性的名字
            //获取该属性在Map中的键值对    属性对应的值
            Object value=values.get(fname);
            //设置访问权限
            fitem.setAccessible(true);
            //注入
            fitem.set(t,value);
        }
        return t;
    }

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        Map map = new HashMap();
        map.put("name","张三");
        map.put("code","C1001");
        map.put("sex","女");
        Student stu = getInstance(Student.class,map);
        System.out.println(stu);
    }

5.Class类中记录类的方法的对象的类是Method类:

在调用类的方法的对象时,要使用invoke()方法

正常在调用方法时:
原来的写法: 对象.方法名(参数)
反射中的写法: method对象.invoke(对象)

public class EasyClassD {
    public static void main(String[] args) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Class<Easy> c = Easy.class;
        //反射获取方法   Method类用来存储类对象的方法
        Method ma=c.getMethod("methodA");
        Easy easy = c.newInstance();
        //调用这个方法
        ma.invoke(easy);

        Method mb = c.getMethod("methodB", int.class, int.class);//传入参数时的写法
        mb.invoke(easy,2,13);
    }
}

6.Class类中记录类的构造方法的对象的类是Constructor类

public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException, IntrospectionException {
        //反射获取构造方法
        Class<Easy> c = Easy.class;
        //可以通过newInstance直接创建对象
        c.newInstance();

        //获取无参构造方法
        Constructor<Easy> con = c.getConstructor();//构造方法名确定,只需要传入参数列表
        con.newInstance();//无参的构造方法
        con=c.getConstructor(String.class);//字符串参数的构造方法
        con.newInstance("张三");

        //修饰符
        //使用Modifier的方法判断属性/方法/构造方法的修饰符
        Field f = c.getDeclaredField("test");
        int fmod = f.getModifiers();//获取属性的修饰符的类型
        boolean bool = Modifier.isStatic(fmod);
        System.out.println(bool);
}

7.内省

内省:也是通过反射来实现的    内省不会破坏封装性
内省 :底层是通过反射实现,内省获取属性的读方法和写方法(getter/setter)来获取和设置属性的内容,不会破坏类的封装性

//内省      也是通过反射来实现的    内省不会破坏封装性
        //内省 :底层是通过反射实现,内省获取属性的读方法和写方法(getter/setter)来获取和设置属性的内容,不会破坏类的封装性
        //获取BeanInfo、
        BeanInfo bi = Introspector.getBeanInfo(c);
        //获取某一个属性写的方法和读的方法   setter/getter
        PropertyDescriptor[] pds = bi.getPropertyDescriptors();
        System.out.println(Arrays.toString(pds));
        String pName = pds[0].getName();//获取属性的名字
        Method read = pds[0].getReadMethod();//获取该属性的getter方法
        Method write = pds[0].getWriteMethod();//获取该属性的setter方法

        //obj.setName("zhangsan");
        //write.invoke(obj,"zhangsan");
        Easy easy = c.newInstance();
        write.invoke(easy,"zhangsan");

8.HTML

1.标签

1.页面标题:

2.<h><h/>标题,从h1~h6依次缩小:

3. <p></p>段落标签

 

4.图片

<img>

 

 

<img>中的src写的是图片复制到HBuilder当前文件中的图片

alt是在这个路径找不到图片时显示在网页上的文字

5.超链接

<a></a>超链接

超链接中href后写的是点击超链接后要跳转的地址,在<a></a>中的文字是超链接在网页上呈现的形式

图片也可以当作超链接,href后跟的也可以是HBuilder中的一个网页。

 

 

6.表格

<table></table> 表格

做一个四行四列表格,并把其中几项合并:

 

7.列表

列表分为有序列表(有序号)和无序列表 (无序号)

有序列表<ol></ol>

无序列表<ul></ul>

 

标签:第十一天,Class,26,Java,String,name,获取,public,属性
From: https://blog.csdn.net/tuowenjian/article/details/140713225

相关文章

  • [Java基础]Finally
    finally中的代码一定会执行吗?通常在面试中,只要是疑问句一般答案都是“否定”的,因为如果是“确定”和“正常”的,那面试官就没有必要再问了嘛,而今天这道题的答案也是符合这个套路。1.典型回答正常运行的情况下,finally中的代码是一定会执行的,但是,如果遇到以下异常情况,那么finall......
  • JAVA集中学习第二周学习记录(四)
    系列文章目录第一章JAVA集中学习第一周学习记录(一)第二章JAVA集中学习第一周项目实践第三章JAVA集中学习第一周学习记录(二)第四章JAVA集中学习第一周课后习题第五章JAVA集中学习第二周学习记录(一)第六章JAVA集中学习第二周项目实践第七章JAVA集中学习第二......
  • 7.26课后作业
    课堂笔记整理思维导图二、使用fgets统计给定文件的行号intmain(intargc,constchar*argv[]){ intcount=0; FILE*file=fopen("./text.txt","r"); charbuf[20]=""; char*data=fgets(buf,sizeof(buf),file); while(data!=NULL){ intindex=strlen(data......
  • [Java面向对象]final
    final简介[2]final关键字可用于多个场景,且在不同场景具有不同的作用。首先,final是一个非访问修饰符,仅适用于变量,方法或类。下面是使用final的不同场景:java中的final关键字上面这张图可以概括成:当final修饰变量时,被修饰的变量必须被初始化(赋值),且后续不能修改其值,实质上是常......
  • JAVA集中学习第二周项目实践[图书管理系统]
    系列文章目录第一章JAVA集中学习第一周学习记录(一)第二章JAVA集中学习第一周项目实践第三章JAVA集中学习第一周学习记录(二)第四章JAVA集中学习第一周课后习题第五章JAVA集中学习第二周学习记录(一)第六章JAVA集中学习第二周项目实践文章目录系列文章目录......
  • [Java并发]
    多线程的价值(这里展示的是网上的答案,我觉得真正重要的是减少进程切换的代价)发挥多核CPU的优势多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的,采用多线程的方式去同时完成几件事而不互相干扰。防止阻塞从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的......
  • java位运算
    位运算符:针对二进制的值补码形式进行计算的&|^(相同为0,不同为1)~<<>>>>>publicclassWeiOptDemo1{publicstaticvoidmain(String[]args){bytea1=3;byteb1=4;System.out.println(a1&b1);System.out.println(a1|b1);System.o......
  • java 06
    输入:引入scannerimportjava.util.ScannerScannerscanner=newScanner(System.in)Stringname=mySanneer.nextInt()//输入内容在命令框输入Javainput进制:十进制转二进制:不断除以2最后将余数倒着拍;转8转16相似;位运算:1>>2:1向右位移两位;1<<2左移2原码反码补码:如......
  • 创建 Java 虚拟机JVM中的参数说明
    1、上一篇创建虚拟机的代码加参数备注varOptions:array[0..4]ofJavaVMOption;VM_args:JavaVMInitArgs;ErrCode:Integer;begin{创建Java虚拟机}FJavaVM:=TJavaVM.Create(JNI_VERSION_1_8);//这个选项设置Java类路径,指定JVM应该在哪里......
  • java静态代码检测-spotbugs
    以前使用的findbugs宣布在2016年后已经不做维护了,取而代之的是spotbugs.要想使用spotbugs,需要在代码仓库中做一些配置1.在maven项目的pom.xml文件中,加入依赖包: officalwebsiteurlreference: https://spotbugs.readthedocs.io/en/latest/maven.html<plugin><groupId......